@jsenv/humanize 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +25 -10
  2. package/dist/browser/jsenv_humanize_browser.js +96 -2
  3. package/dist/node/jsenv_humanize_node.js +1470 -1531
  4. package/package.json +3 -3
  5. package/src/.jsenv/jsenv_tests_output.txt +27 -30
  6. package/src/_tests/byte/file_size.test.js +2 -2
  7. package/src/_tests/byte/memory.test.js +11 -0
  8. package/src/_tests/js_value/array.test.js +14 -14
  9. package/src/_tests/js_value/biginit.test.js +10 -10
  10. package/src/_tests/js_value/boolean.test.js +12 -12
  11. package/src/_tests/js_value/date.test.js +4 -4
  12. package/src/_tests/js_value/error.test.js +8 -8
  13. package/src/_tests/js_value/function.test.js +12 -12
  14. package/src/_tests/js_value/instance.test.js +2 -2
  15. package/src/_tests/js_value/null.test.js +2 -2
  16. package/src/_tests/js_value/number.test.js +54 -54
  17. package/src/_tests/js_value/object.test.js +34 -34
  18. package/src/_tests/js_value/regexp.test.js +4 -4
  19. package/src/_tests/js_value/string.test.js +32 -32
  20. package/src/_tests/js_value/symbol.test.js +6 -6
  21. package/src/_tests/js_value/undefined.test.js +2 -2
  22. package/src/_tests/log/logger.test.mjs +14 -14
  23. package/src/_tests/log/spinner.test.mjs +6 -6
  24. package/src/_tests/percentage/percentage_distribution.test.mjs +2 -2
  25. package/src/_tests/time/decimals.test.js +40 -40
  26. package/src/_tests/time/duration.test.js +2 -2
  27. package/src/_tests/time/ellapsed.test.js +2 -2
  28. package/src/ansi/ansi_browser.js +3 -0
  29. package/src/ansi/ansi_node.js +16 -0
  30. package/src/ansi/ansi_runtime_agnostic.js +33 -0
  31. package/src/byte/byte.js +1 -1
  32. package/src/js_value/humanize.js +1 -1
  33. package/src/js_value/string.js +1 -1
  34. package/src/log/dynamic_log.js +6 -4
  35. package/src/log/spinner.js +1 -1
  36. package/src/log/task_log.js +1 -1
  37. package/src/main_browser.js +3 -5
  38. package/src/main_node.js +9 -13
  39. package/src/unicode/unicode_browser.js +7 -0
  40. package/src/unicode/unicode_node.js +8 -0
  41. package/src/unicode/unicode_runtime_agnostic.js +53 -0
  42. package/src/_tests/byte/memory_usage.test.js +0 -11
  43. package/src/log/ansi.js +0 -37
  44. package/src/log/unicode.js +0 -52
@@ -3,21 +3,21 @@ import { humanize } from "@jsenv/humanize";
3
3
 
4
4
  {
5
5
  const actual = humanize({});
6
- const expected = "{}";
7
- assert({ actual, expected });
6
+ const expect = "{}";
7
+ assert({ actual, expect });
8
8
  }
9
9
 
10
10
  {
11
11
  // eslint-disable-next-line no-new-object
12
12
  const actual = humanize(new Object({}));
13
- const expected = "{}";
14
- assert({ actual, expected });
13
+ const expect = "{}";
14
+ assert({ actual, expect });
15
15
  }
16
16
 
17
17
  {
18
18
  const actual = humanize({}, { objectConstructor: true });
19
- const expected = "Object({})";
20
- assert({ actual, expected });
19
+ const expect = "Object({})";
20
+ assert({ actual, expect });
21
21
  }
22
22
 
23
23
  {
@@ -25,37 +25,37 @@ import { humanize } from "@jsenv/humanize";
25
25
  { foo: true },
26
26
  { objectConstructor: true, useNew: true },
27
27
  );
28
- const expected = `new Object({
28
+ const expect = `new Object({
29
29
  "foo": true
30
30
  })`;
31
31
  assert({
32
32
  actual,
33
- expected,
33
+ expect,
34
34
  });
35
35
  }
36
36
 
37
37
  {
38
38
  const actual = humanize({ 0: "foo" });
39
- const expected = `{
39
+ const expect = `{
40
40
  0: "foo"
41
41
  }`;
42
- assert({ actual, expected });
42
+ assert({ actual, expect });
43
43
  }
44
44
 
45
45
  {
46
46
  const actual = humanize({ Infinity: "foo" });
47
- const expected = `{
47
+ const expect = `{
48
48
  "Infinity": "foo"
49
49
  }`;
50
- assert({ actual, expected });
50
+ assert({ actual, expect });
51
51
  }
52
52
 
53
53
  {
54
54
  const actual = humanize({ name: "dam" }, { quote: "'" });
55
- const expected = `{
55
+ const expect = `{
56
56
  'name': 'dam'
57
57
  }`;
58
- assert({ actual, expected });
58
+ assert({ actual, expect });
59
59
  }
60
60
 
61
61
  {
@@ -63,24 +63,24 @@ import { humanize } from "@jsenv/humanize";
63
63
  { foo: true, nested: { bar: true } },
64
64
  { parenthesis: true },
65
65
  );
66
- const expected = `({
66
+ const expect = `({
67
67
  "foo": true,
68
68
  "nested": ({
69
69
  "bar": true
70
70
  })
71
71
  })`;
72
- assert({ actual, expected });
72
+ assert({ actual, expect });
73
73
  }
74
74
 
75
75
  {
76
76
  const foo = { foo: true, bar: false };
77
77
 
78
78
  const actual = humanize(foo);
79
- const expected = `{
79
+ const expect = `{
80
80
  "foo": true,
81
81
  "bar": false
82
82
  }`;
83
- assert({ actual, expected });
83
+ assert({ actual, expect });
84
84
  }
85
85
 
86
86
  {
@@ -89,19 +89,19 @@ import { humanize } from "@jsenv/humanize";
89
89
  foo: true,
90
90
  }),
91
91
  );
92
- const expected = "{}";
93
- assert({ actual, expected });
92
+ const expect = "{}";
93
+ assert({ actual, expect });
94
94
  }
95
95
 
96
96
  {
97
97
  const nested = { foo: { name: "dam" } };
98
98
  const actual = humanize(nested);
99
- const expected = `{
99
+ const expect = `{
100
100
  "foo": {
101
101
  "name": "dam"
102
102
  }
103
103
  }`;
104
- assert({ actual, expected });
104
+ assert({ actual, expect });
105
105
  }
106
106
 
107
107
  {
@@ -110,11 +110,11 @@ import { humanize } from "@jsenv/humanize";
110
110
  };
111
111
  circularObject.self = circularObject;
112
112
  const actual = humanize(circularObject);
113
- const expected = `{
113
+ const expect = `{
114
114
  "foo": true,
115
115
  "self": Symbol.for('circular')
116
116
  }`;
117
- assert({ actual, expected });
117
+ assert({ actual, expect });
118
118
  }
119
119
 
120
120
  {
@@ -126,30 +126,30 @@ import { humanize } from "@jsenv/humanize";
126
126
  parent: nestedCircularObject,
127
127
  };
128
128
  const actual = humanize(nestedCircularObject);
129
- const expected = `{
129
+ const expect = `{
130
130
  "foo": true,
131
131
  "nested": {
132
132
  "bar": true,
133
133
  "parent": Symbol.for('circular')
134
134
  }
135
135
  }`;
136
- assert({ actual, expected });
136
+ assert({ actual, expect });
137
137
  }
138
138
 
139
139
  {
140
140
  const actual = humanize(Object.create(null));
141
- const expected = "{}";
142
- assert({ actual, expected });
141
+ const expect = "{}";
142
+ assert({ actual, expect });
143
143
  }
144
144
 
145
145
  {
146
146
  const object = Object.create(null);
147
147
  object[Symbol.toStringTag] = "stuff";
148
148
  const actual = humanize(object);
149
- const expected = `{
149
+ const expect = `{
150
150
  [Symbol("Symbol.toStringTag")]: "stuff"
151
151
  }`;
152
- assert({ actual, expected });
152
+ assert({ actual, expect });
153
153
  }
154
154
 
155
155
  {
@@ -157,17 +157,17 @@ import { humanize } from "@jsenv/humanize";
157
157
  object[Symbol.toStringTag] = "stuff";
158
158
  object.foo = true;
159
159
  const actual = humanize(object);
160
- const expected = `{
160
+ const expect = `{
161
161
  "foo": true,
162
162
  [Symbol("Symbol.toStringTag")]: "stuff"
163
163
  }`;
164
- assert({ actual, expected });
164
+ assert({ actual, expect });
165
165
  }
166
166
 
167
167
  {
168
168
  const actual = humanize({ [Symbol()]: true });
169
- const expected = `{
169
+ const expect = `{
170
170
  [Symbol()]: true
171
171
  }`;
172
- assert({ actual, expected });
172
+ assert({ actual, expect });
173
173
  }
@@ -3,12 +3,12 @@ import { humanize } from "@jsenv/humanize";
3
3
 
4
4
  {
5
5
  const actual = humanize(/ok/g);
6
- const expected = "/ok/g";
7
- assert({ actual, expected });
6
+ const expect = "/ok/g";
7
+ assert({ actual, expect });
8
8
  }
9
9
 
10
10
  {
11
11
  const actual = humanize(new RegExp("foo", "g"));
12
- const expected = "/foo/g";
13
- assert({ actual, expected });
12
+ const expect = "/foo/g";
13
+ assert({ actual, expect });
14
14
  }
@@ -3,104 +3,104 @@ import { humanize } from "@jsenv/humanize";
3
3
 
4
4
  {
5
5
  const actual = humanize(String.fromCharCode(127));
6
- const expected = `"\\x7F"`;
7
- assert({ actual, expected });
6
+ const expect = `"\\x7F"`;
7
+ assert({ actual, expect });
8
8
  }
9
9
 
10
10
  {
11
11
  const actual = humanize("");
12
- const expected = `""`;
13
- assert({ actual, expected });
12
+ const expect = `""`;
13
+ assert({ actual, expect });
14
14
  }
15
15
 
16
16
  {
17
17
  const actual = humanize("dam");
18
- const expected = `"dam"`;
19
- assert({ actual, expected });
18
+ const expect = `"dam"`;
19
+ assert({ actual, expect });
20
20
  }
21
21
 
22
22
  {
23
23
  const actual = humanize("don't");
24
- const expected = `"don't"`;
25
- assert({ actual, expected });
24
+ const expect = `"don't"`;
25
+ assert({ actual, expect });
26
26
  }
27
27
 
28
28
  {
29
29
  const actual = humanize("don't", { quote: "'" });
30
- const expected = `'don\\\'t'`;
31
- assert({ actual, expected });
30
+ const expect = `'don\\\'t'`;
31
+ assert({ actual, expect });
32
32
  }
33
33
 
34
34
  {
35
35
  const actual = humanize(`his name is "dam"`);
36
- const expected = `'his name is "dam"'`;
37
- assert({ actual, expected });
36
+ const expect = `'his name is "dam"'`;
37
+ assert({ actual, expect });
38
38
  }
39
39
 
40
40
  {
41
41
  const actual = humanize(`his name is "dam"`, { quote: "'" });
42
- const expected = `'his name is "dam"'`;
43
- assert({ actual, expected });
42
+ const expect = `'his name is "dam"'`;
43
+ assert({ actual, expect });
44
44
  }
45
45
 
46
46
  {
47
47
  const actual = humanize("a\nb");
48
- const expected = `"a\\nb"`;
49
- assert({ actual, expected });
48
+ const expect = `"a\\nb"`;
49
+ assert({ actual, expect });
50
50
  }
51
51
 
52
52
  {
53
53
  const actual = humanize("a\rb");
54
- const expected = `"a\\rb"`;
55
- assert({ actual, expected });
54
+ const expect = `"a\\rb"`;
55
+ assert({ actual, expect });
56
56
  }
57
57
 
58
58
  {
59
59
  const actual = humanize("a\u2028b");
60
- const expected = `"a\\u2028b"`;
61
- assert({ actual, expected });
60
+ const expect = `"a\\u2028b"`;
61
+ assert({ actual, expect });
62
62
  }
63
63
 
64
64
  {
65
65
  const actual = humanize("a\u2029b");
66
- const expected = `"a\\u2029b"`;
67
- assert({ actual, expected });
66
+ const expect = `"a\\u2029b"`;
67
+ assert({ actual, expect });
68
68
  }
69
69
 
70
70
  {
71
71
  // eslint-disable-next-line no-new-wrappers
72
72
  const actual = humanize(new String(""));
73
- const expected = `String("")`;
73
+ const expect = `String("")`;
74
74
  assert({
75
75
  actual,
76
- expected,
76
+ expect,
77
77
  });
78
78
  }
79
79
 
80
80
  {
81
81
  // eslint-disable-next-line no-new-wrappers
82
82
  const actual = humanize(new String("dam"));
83
- const expected = `String("dam")`;
83
+ const expect = `String("dam")`;
84
84
  assert({
85
85
  actual,
86
- expected,
86
+ expect,
87
87
  });
88
88
  }
89
89
 
90
90
  {
91
91
  const actual = humanize("dam", { quote: "'" });
92
- const expected = `'dam'`;
93
- assert({ actual, expected });
92
+ const expect = `'dam'`;
93
+ assert({ actual, expect });
94
94
  }
95
95
 
96
96
  {
97
97
  const actual = humanize(`\`"'`);
98
- const expected = `"\`\\\"'"`;
99
- assert({ actual, expected });
98
+ const expect = `"\`\\\"'"`;
99
+ assert({ actual, expect });
100
100
  }
101
101
 
102
102
  {
103
103
  const actual = humanize(`""''`);
104
- const expected = `\`""''\``;
105
- assert({ actual, expected });
104
+ const expect = `\`""''\``;
105
+ assert({ actual, expect });
106
106
  }
@@ -3,18 +3,18 @@ import { humanize } from "@jsenv/humanize";
3
3
 
4
4
  {
5
5
  const actual = humanize(Symbol());
6
- const expected = "Symbol()";
7
- assert({ actual, expected });
6
+ const expect = "Symbol()";
7
+ assert({ actual, expect });
8
8
  }
9
9
 
10
10
  {
11
11
  const actual = humanize(Symbol("foo"));
12
- const expected = `Symbol("foo")`;
13
- assert({ actual, expected });
12
+ const expect = `Symbol("foo")`;
13
+ assert({ actual, expect });
14
14
  }
15
15
 
16
16
  {
17
17
  const actual = humanize(Symbol(42));
18
- const expected = `Symbol("42")`;
19
- assert({ actual, expected });
18
+ const expect = `Symbol("42")`;
19
+ assert({ actual, expect });
20
20
  }
@@ -2,5 +2,5 @@ import { assert } from "@jsenv/assert";
2
2
  import { humanize } from "@jsenv/humanize";
3
3
 
4
4
  const actual = humanize(undefined);
5
- const expected = "undefined";
6
- assert({ actual, expected });
5
+ const expect = "undefined";
6
+ assert({ actual, expect });
@@ -6,7 +6,7 @@ try {
6
6
  createLogger({ logLevel: "foo" });
7
7
  throw new Error("should throw");
8
8
  } catch (actual) {
9
- const expected = new Error(`unexpected logLevel.
9
+ const expect = new Error(`unexpected logLevel.
10
10
  --- logLevel ---
11
11
  foo
12
12
  --- allowed log levels ---
@@ -15,77 +15,77 @@ error
15
15
  warn
16
16
  info
17
17
  debug`);
18
- assert({ actual, expected });
18
+ assert({ actual, expect });
19
19
  }
20
20
 
21
21
  {
22
22
  const logger = createLogger();
23
23
  const actual = logger.levels;
24
- const expected = {
24
+ const expect = {
25
25
  debug: false,
26
26
  info: true,
27
27
  warn: true,
28
28
  error: true,
29
29
  };
30
- assert({ actual, expected });
30
+ assert({ actual, expect });
31
31
  }
32
32
 
33
33
  {
34
34
  const logger = createLogger({ logLevel: "off" });
35
35
  const actual = logger.levels;
36
- const expected = {
36
+ const expect = {
37
37
  debug: false,
38
38
  info: false,
39
39
  warn: false,
40
40
  error: false,
41
41
  };
42
- assert({ actual, expected });
42
+ assert({ actual, expect });
43
43
  }
44
44
 
45
45
  {
46
46
  const logger = createLogger({ logLevel: "debug" });
47
47
  const actual = logger.levels;
48
- const expected = {
48
+ const expect = {
49
49
  debug: true,
50
50
  info: true,
51
51
  warn: true,
52
52
  error: true,
53
53
  };
54
- assert({ actual, expected });
54
+ assert({ actual, expect });
55
55
  }
56
56
 
57
57
  {
58
58
  const logger = createLogger({ logLevel: "info" });
59
59
  const actual = logger.levels;
60
- const expected = {
60
+ const expect = {
61
61
  debug: false,
62
62
  info: true,
63
63
  warn: true,
64
64
  error: true,
65
65
  };
66
- assert({ actual, expected });
66
+ assert({ actual, expect });
67
67
  }
68
68
 
69
69
  {
70
70
  const logger = createLogger({ logLevel: "warn" });
71
71
  const actual = logger.levels;
72
- const expected = {
72
+ const expect = {
73
73
  debug: false,
74
74
  info: false,
75
75
  warn: true,
76
76
  error: true,
77
77
  };
78
- assert({ actual, expected });
78
+ assert({ actual, expect });
79
79
  }
80
80
 
81
81
  {
82
82
  const logger = createLogger({ logLevel: "error" });
83
83
  const actual = logger.levels;
84
- const expected = {
84
+ const expect = {
85
85
  debug: false,
86
86
  info: false,
87
87
  warn: false,
88
88
  error: true,
89
89
  };
90
- assert({ actual, expected });
90
+ assert({ actual, expect });
91
91
  }
@@ -12,22 +12,22 @@
12
12
 
13
13
  // {
14
14
  // const actual = getOutput()
15
- // const expected = `a loading\n`
16
- // assert({ actual, expected })
15
+ // const expect = `a loading\n`
16
+ // assert({ actual, expect })
17
17
  // }
18
18
  // getOutput = spyStreamOutput(process.stdout)
19
19
  // await new Promise((resolve) => setTimeout(resolve, 1500))
20
20
 
21
21
  // {
22
22
  // const actual = getOutput()
23
- // const expected = `b loading\n`
24
- // assert({ actual, expected })
23
+ // const expect = `b loading\n`
24
+ // assert({ actual, expect })
25
25
  // }
26
26
  // getOutput = spyStreamOutput(process.stdout)
27
27
  // await new Promise((resolve) => setTimeout(resolve, 1500))
28
28
 
29
29
  // {
30
30
  // const actual = getOutput()
31
- // const expected = `a loading\n`
32
- // assert({ actual, expected })
31
+ // const expect = `a loading\n`
32
+ // assert({ actual, expect })
33
33
  // }
@@ -2,9 +2,9 @@ import { assert } from "@jsenv/assert";
2
2
 
3
3
  import { distributePercentages } from "@jsenv/humanize";
4
4
 
5
- const test = (namedNumbers, expected) => {
5
+ const test = (namedNumbers, expect) => {
6
6
  const actual = distributePercentages(namedNumbers);
7
- assert({ actual, expected });
7
+ assert({ actual, expect });
8
8
  };
9
9
 
10
10
  test(
@@ -11,109 +11,109 @@ import {
11
11
  // rounds last decimal
12
12
  {
13
13
  const actual = setRoundedPrecision(0.54);
14
- const expected = 0.5;
15
- assert({ actual, expected });
14
+ const expect = 0.5;
15
+ assert({ actual, expect });
16
16
  }
17
17
  {
18
18
  const actual = setRoundedPrecision(0.55);
19
- const expected = 0.6;
20
- assert({ actual, expected });
19
+ const expect = 0.6;
20
+ assert({ actual, expect });
21
21
  }
22
22
  // floor last decimal
23
23
  {
24
24
  const actual = setFlooredPrecision(0.54);
25
- const expected = 0.5;
26
- assert({ actual, expected });
25
+ const expect = 0.5;
26
+ assert({ actual, expect });
27
27
  }
28
28
  {
29
29
  const actual = setFlooredPrecision(0.55);
30
- const expected = 0.5;
31
- assert({ actual, expected });
30
+ const expect = 0.5;
31
+ assert({ actual, expect });
32
32
  }
33
33
  {
34
34
  const actual = setFlooredPrecision(0.501);
35
- const expected = 0.5;
36
- assert({ actual, expected });
35
+ const expect = 0.5;
36
+ assert({ actual, expect });
37
37
  }
38
38
  // ceil last decimal
39
39
  {
40
40
  const actual = setCeiledPrecision(0.54);
41
- const expected = 0.6;
42
- assert({ actual, expected });
41
+ const expect = 0.6;
42
+ assert({ actual, expect });
43
43
  }
44
44
  {
45
45
  const actual = setCeiledPrecision(0.54);
46
- const expected = 0.6;
47
- assert({ actual, expected });
46
+ const expect = 0.6;
47
+ assert({ actual, expect });
48
48
  }
49
49
  {
50
50
  const actual = setCeiledPrecision(0.501);
51
- const expected = 0.6;
52
- assert({ actual, expected });
51
+ const expect = 0.6;
52
+ assert({ actual, expect });
53
53
  }
54
54
  // truncate last decimal
55
55
  {
56
56
  const actual = setPrecision(0.501);
57
- const expected = 0.5;
58
- assert({ actual, expected });
57
+ const expect = 0.5;
58
+ assert({ actual, expect });
59
59
  }
60
60
  {
61
61
  const actual = setPrecision(0.56);
62
- const expected = 0.5;
63
- assert({ actual, expected });
62
+ const expect = 0.5;
63
+ assert({ actual, expect });
64
64
  }
65
65
  // rounded tests
66
66
  {
67
67
  const actual = setRoundedPrecision(0.0101);
68
- const expected = 0.01;
69
- assert({ actual, expected });
68
+ const expect = 0.01;
69
+ assert({ actual, expect });
70
70
  }
71
71
  {
72
72
  const actual = setRoundedPrecision(0.012);
73
- const expected = 0.01;
74
- assert({ actual, expected });
73
+ const expect = 0.01;
74
+ assert({ actual, expect });
75
75
  }
76
76
  {
77
77
  const actual = setRoundedPrecision(0.016);
78
- const expected = 0.02;
79
- assert({ actual, expected });
78
+ const expect = 0.02;
79
+ assert({ actual, expect });
80
80
  }
81
81
  {
82
82
  const actual = setRoundedPrecision(0.016556, {
83
83
  decimals: 3,
84
84
  });
85
- const expected = 0.0166;
86
- assert({ actual, expected });
85
+ const expect = 0.0166;
86
+ assert({ actual, expect });
87
87
  }
88
88
  {
89
89
  const actual = setRoundedPrecision(0);
90
- const expected = 0;
91
- assert({ actual, expected });
90
+ const expect = 0;
91
+ assert({ actual, expect });
92
92
  }
93
93
  {
94
94
  const actual = setRoundedPrecision(-0.0015);
95
- const expected = -0.002;
96
- assert({ actual, expected });
95
+ const expect = -0.002;
96
+ assert({ actual, expect });
97
97
  }
98
98
 
99
99
  /* numbers above 1 */
100
100
  {
101
101
  const actual = setRoundedPrecision(37.04);
102
- const expected = 37;
103
- assert({ actual, expected });
102
+ const expect = 37;
103
+ assert({ actual, expect });
104
104
  }
105
105
  {
106
106
  const actual = setRoundedPrecision(37.05);
107
- const expected = 37.1;
108
- assert({ actual, expected });
107
+ const expect = 37.1;
108
+ assert({ actual, expect });
109
109
  }
110
110
  {
111
111
  const actual = setCeiledPrecision(37.01);
112
- const expected = 37.1;
113
- assert({ actual, expected });
112
+ const expect = 37.1;
113
+ assert({ actual, expect });
114
114
  }
115
115
  {
116
116
  const actual = setFlooredPrecision(37.01);
117
- const expected = 37;
118
- assert({ actual, expected });
117
+ const expect = 37;
118
+ assert({ actual, expect });
119
119
  }
@@ -2,9 +2,9 @@ import { assert } from "@jsenv/assert";
2
2
 
3
3
  import { humanizeDuration } from "@jsenv/humanize";
4
4
 
5
- const test = (durationInMs, expected) => {
5
+ const test = (durationInMs, expect) => {
6
6
  const actual = humanizeDuration(durationInMs);
7
- assert({ actual, expected });
7
+ assert({ actual, expect });
8
8
  };
9
9
 
10
10
  test(0.1, "0 second");