1023dd3b8Sopenharmony_ci// Adds global: T
2023dd3b8Sopenharmony_ci
3023dd3b8Sopenharmony_ciT = (function () {
4023dd3b8Sopenharmony_ci  var passed, testNumber, write;
5023dd3b8Sopenharmony_ci
6023dd3b8Sopenharmony_ci  function T(name, tests) {
7023dd3b8Sopenharmony_ci    var time;
8023dd3b8Sopenharmony_ci    write(' Testing ' + name + '...');
9023dd3b8Sopenharmony_ci    passed = testNumber = 0;
10023dd3b8Sopenharmony_ci    time = new Date();
11023dd3b8Sopenharmony_ci    tests();
12023dd3b8Sopenharmony_ci    time = new Date() - time;
13023dd3b8Sopenharmony_ci    T.result = [passed, testNumber, time];
14023dd3b8Sopenharmony_ci    if (passed !== testNumber) write('\n');
15023dd3b8Sopenharmony_ci    write(' ' + passed + ' of ' + testNumber + ' tests passed in ' + time + ' ms\n');
16023dd3b8Sopenharmony_ci  }
17023dd3b8Sopenharmony_ci
18023dd3b8Sopenharmony_ci  if (typeof window != 'undefined') {
19023dd3b8Sopenharmony_ci    write = function (str) {
20023dd3b8Sopenharmony_ci      document.body.innerHTML += str.replace(/\n/g, '<br>').replace(/ /g, '&nbsp;');
21023dd3b8Sopenharmony_ci    };
22023dd3b8Sopenharmony_ci  } else {
23023dd3b8Sopenharmony_ci    Decimal = require('../decimal');
24023dd3b8Sopenharmony_ci    write = process.stdout.write.bind(process.stdout);
25023dd3b8Sopenharmony_ci  }
26023dd3b8Sopenharmony_ci
27023dd3b8Sopenharmony_ci  T.assert = function (actual) {
28023dd3b8Sopenharmony_ci    ++testNumber;
29023dd3b8Sopenharmony_ci    if (actual === true) {
30023dd3b8Sopenharmony_ci      ++passed;
31023dd3b8Sopenharmony_ci      //write('\n Expected and actual: ' + actual);
32023dd3b8Sopenharmony_ci    } else {
33023dd3b8Sopenharmony_ci      write(
34023dd3b8Sopenharmony_ci        '\n  Test number ' + testNumber + ' failed: assert' +
35023dd3b8Sopenharmony_ci        '\n  Expected: true' +
36023dd3b8Sopenharmony_ci        '\n  Actual:   ' + actual
37023dd3b8Sopenharmony_ci      );
38023dd3b8Sopenharmony_ci      //process.exit();
39023dd3b8Sopenharmony_ci    }
40023dd3b8Sopenharmony_ci  };
41023dd3b8Sopenharmony_ci
42023dd3b8Sopenharmony_ci  T.assertEqual = function (expected, actual) {
43023dd3b8Sopenharmony_ci    ++testNumber;
44023dd3b8Sopenharmony_ci    // If expected and actual are both NaN, consider them equal.
45023dd3b8Sopenharmony_ci    if (expected === actual || expected !== expected && actual !== actual) {
46023dd3b8Sopenharmony_ci      ++passed;
47023dd3b8Sopenharmony_ci    } else {
48023dd3b8Sopenharmony_ci      write(
49023dd3b8Sopenharmony_ci        '\n  Test number ' + testNumber + ' failed: assertEqual' +
50023dd3b8Sopenharmony_ci        '\n  Expected: ' + expected +
51023dd3b8Sopenharmony_ci        '\n  Actual:   ' + actual
52023dd3b8Sopenharmony_ci      );
53023dd3b8Sopenharmony_ci    }
54023dd3b8Sopenharmony_ci  };
55023dd3b8Sopenharmony_ci
56023dd3b8Sopenharmony_ci  T.assertEqualDecimal = function (x, y) {
57023dd3b8Sopenharmony_ci    ++testNumber;
58023dd3b8Sopenharmony_ci    if (x.eq(y) || x.isNaN() && y.isNaN()) {
59023dd3b8Sopenharmony_ci      ++passed;
60023dd3b8Sopenharmony_ci    } else {
61023dd3b8Sopenharmony_ci      write(
62023dd3b8Sopenharmony_ci        '\n  Test number ' + testNumber + ' failed: assertEqualDecimal' +
63023dd3b8Sopenharmony_ci        '\n  x: ' + x.valueOf() +
64023dd3b8Sopenharmony_ci        '\n  y: ' + y.valueOf()
65023dd3b8Sopenharmony_ci      );
66023dd3b8Sopenharmony_ci    }
67023dd3b8Sopenharmony_ci  };
68023dd3b8Sopenharmony_ci
69023dd3b8Sopenharmony_ci  T.assertEqualProps = function (digits, exponent, sign, n) {
70023dd3b8Sopenharmony_ci    var i = 0,
71023dd3b8Sopenharmony_ci      len = digits.length;
72023dd3b8Sopenharmony_ci    ++testNumber;
73023dd3b8Sopenharmony_ci    while (i < len && digits[i] === n.d[i]) ++i;
74023dd3b8Sopenharmony_ci    if (i === len && i === n.d.length && exponent === n.e && sign === n.s) {
75023dd3b8Sopenharmony_ci      ++passed;
76023dd3b8Sopenharmony_ci    } else {
77023dd3b8Sopenharmony_ci      write(
78023dd3b8Sopenharmony_ci        '\n  Test number ' + testNumber + ' failed: assertEqualProps' +
79023dd3b8Sopenharmony_ci        '\n  Expected digits:   ' + digits +
80023dd3b8Sopenharmony_ci        '\n  Expected exponent: ' + exponent +
81023dd3b8Sopenharmony_ci        '\n  Expected sign:     ' + sign +
82023dd3b8Sopenharmony_ci        '\n  Actual digits:     ' + n.d +
83023dd3b8Sopenharmony_ci        '\n  Actual exponent:   ' + n.e +
84023dd3b8Sopenharmony_ci        '\n  Actual sign:       ' + n.s
85023dd3b8Sopenharmony_ci      );
86023dd3b8Sopenharmony_ci    }
87023dd3b8Sopenharmony_ci  };
88023dd3b8Sopenharmony_ci
89023dd3b8Sopenharmony_ci  T.assertException = function (func, msg) {
90023dd3b8Sopenharmony_ci    var actual;
91023dd3b8Sopenharmony_ci    ++testNumber;
92023dd3b8Sopenharmony_ci    try {
93023dd3b8Sopenharmony_ci      func();
94023dd3b8Sopenharmony_ci    } catch (e) {
95023dd3b8Sopenharmony_ci      actual = e;
96023dd3b8Sopenharmony_ci    }
97023dd3b8Sopenharmony_ci    if (actual instanceof Error && /DecimalError/.test(actual.message)) {
98023dd3b8Sopenharmony_ci      ++passed;
99023dd3b8Sopenharmony_ci    } else {
100023dd3b8Sopenharmony_ci      write(
101023dd3b8Sopenharmony_ci        '\n  Test number ' + testNumber + ' failed: assertException' +
102023dd3b8Sopenharmony_ci        '\n  Expected: ' + msg + ' to raise a DecimalError.' +
103023dd3b8Sopenharmony_ci        '\n  Actual:   ' + (actual || 'no exception')
104023dd3b8Sopenharmony_ci      );
105023dd3b8Sopenharmony_ci    }
106023dd3b8Sopenharmony_ci  };
107023dd3b8Sopenharmony_ci
108023dd3b8Sopenharmony_ci  return T;
109023dd3b8Sopenharmony_ci})();
110