ts-data-forge 6.13.1 → 7.0.0
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.
- package/README.md +2 -2
- package/dist/array/impl/array-utils-iterators.mjs +6 -0
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
- package/dist/array/impl/array-utils-modification.mjs +6 -0
- package/dist/array/impl/array-utils-modification.mjs.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +6 -0
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-search.mjs +6 -0
- package/dist/array/impl/array-utils-search.mjs.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.mjs +6 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
- package/dist/array/impl/array-utils-slicing.mjs +6 -0
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +6 -0
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.mjs +6 -0
- package/dist/array/impl/array-utils-validation.mjs.map +1 -1
- package/dist/collections/imap-mapped.mjs +6 -0
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.mjs +6 -0
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.mjs +6 -0
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.mjs +6 -0
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.mjs +6 -0
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.mjs +6 -0
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.mjs +6 -0
- package/dist/entry-point.mjs.map +1 -1
- package/dist/index.mjs +6 -0
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/range.mjs +6 -0
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.mjs +6 -0
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +1 -1
- package/dist/number/branded-types/index.d.mts +6 -0
- package/dist/number/branded-types/index.d.mts.map +1 -1
- package/dist/number/branded-types/index.mjs +6 -0
- package/dist/number/branded-types/index.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +1 -2
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int16.d.mts +2 -3
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int32.d.mts +2 -3
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts +143 -0
- package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/negative-finite-number.mjs +156 -0
- package/dist/number/branded-types/negative-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/negative-int.d.mts +120 -0
- package/dist/number/branded-types/negative-int.d.mts.map +1 -0
- package/dist/number/branded-types/negative-int.mjs +125 -0
- package/dist/number/branded-types/negative-int.mjs.map +1 -0
- package/dist/number/branded-types/negative-safe-int.d.mts +132 -0
- package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/negative-safe-int.mjs +136 -0
- package/dist/number/branded-types/negative-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts +130 -0
- package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-finite-number.mjs +134 -0
- package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/non-positive-int.d.mts +224 -0
- package/dist/number/branded-types/non-positive-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-int.mjs +222 -0
- package/dist/number/branded-types/non-positive-int.mjs.map +1 -0
- package/dist/number/branded-types/non-positive-safe-int.d.mts +119 -0
- package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-safe-int.mjs +116 -0
- package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-finite-number.d.mts +5 -17
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +5 -17
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +5 -33
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +5 -25
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +6 -43
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +5 -25
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +6 -39
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +5 -25
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +5 -37
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +5 -28
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +6 -33
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +5 -17
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +6 -31
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +5 -17
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +4 -2
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +4 -2
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +4 -2
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +4 -2
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +4 -2
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +4 -2
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +4 -2
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +1 -2
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +1 -1
- package/dist/number/branded-types/uint.d.mts +1 -1
- package/dist/number/branded-types/uint16.d.mts +1 -1
- package/dist/number/branded-types/uint32.d.mts +1 -1
- package/dist/number/index.d.mts +1 -0
- package/dist/number/index.d.mts.map +1 -1
- package/dist/number/index.mjs +6 -0
- package/dist/number/index.mjs.map +1 -1
- package/dist/number/num-arithmetic-types.d.mts +74 -0
- package/dist/number/num-arithmetic-types.d.mts.map +1 -0
- package/dist/number/num-arithmetic-types.mjs +2 -0
- package/dist/number/num-arithmetic-types.mjs.map +1 -0
- package/dist/number/num.d.mts +53 -9
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/num.mjs +64 -12
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +12 -9
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.mjs +6 -0
- package/dist/object/object.mjs.map +1 -1
- package/package.json +2 -2
- package/src/number/branded-types/index.mts +6 -0
- package/src/number/branded-types/negative-finite-number.mts +210 -0
- package/src/number/branded-types/negative-finite-number.test.mts +172 -0
- package/src/number/branded-types/negative-int.mts +160 -0
- package/src/number/branded-types/negative-int.test.mts +146 -0
- package/src/number/branded-types/negative-safe-int.mts +173 -0
- package/src/number/branded-types/negative-safe-int.test.mts +120 -0
- package/src/number/branded-types/non-positive-finite-number.mts +191 -0
- package/src/number/branded-types/non-positive-finite-number.test.mts +286 -0
- package/src/number/branded-types/non-positive-int.mts +251 -0
- package/src/number/branded-types/non-positive-int.test.mts +197 -0
- package/src/number/branded-types/non-positive-safe-int.mts +147 -0
- package/src/number/branded-types/non-positive-safe-int.test.mts +223 -0
- package/src/number/branded-types/non-zero-finite-number.mts +14 -22
- package/src/number/branded-types/non-zero-finite-number.test.mts +0 -12
- package/src/number/branded-types/non-zero-int.mts +10 -32
- package/src/number/branded-types/non-zero-int.test.mts +0 -20
- package/src/number/branded-types/non-zero-int16.mts +8 -32
- package/src/number/branded-types/non-zero-int16.test.mts +0 -30
- package/src/number/branded-types/non-zero-int32.mts +8 -32
- package/src/number/branded-types/non-zero-int32.test.mts +0 -30
- package/src/number/branded-types/non-zero-safe-int.mts +8 -35
- package/src/number/branded-types/non-zero-safe-int.test.mts +0 -32
- package/src/number/branded-types/non-zero-uint16.mts +8 -22
- package/src/number/branded-types/non-zero-uint16.test.mts +0 -16
- package/src/number/branded-types/non-zero-uint32.mts +8 -22
- package/src/number/branded-types/non-zero-uint32.test.mts +0 -16
- package/src/number/index.mts +1 -0
- package/src/number/num-arithmetic-types.mts +269 -0
- package/src/number/num-arithmetic-types.test.mts +130 -0
- package/src/number/num-arithmetic.test.mts +102 -0
- package/src/number/num.mts +96 -15
- package/src/number/refined-number-utils.mts +19 -9
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { type NonPositiveFiniteNumber as TtfImported_NonPositiveFiniteNumber } from 'ts-type-forge';
|
|
2
|
+
import { TsDataForgeInternals } from '../refined-number-utils.mjs';
|
|
3
|
+
|
|
4
|
+
export type NonPositiveFiniteNumber = TtfImported_NonPositiveFiniteNumber;
|
|
5
|
+
|
|
6
|
+
type ElementType = NonPositiveFiniteNumber;
|
|
7
|
+
|
|
8
|
+
const typeNameInMessage = 'a non-positive finite number';
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
MAX_VALUE,
|
|
12
|
+
add,
|
|
13
|
+
castType,
|
|
14
|
+
clamp,
|
|
15
|
+
is,
|
|
16
|
+
max: max_,
|
|
17
|
+
min: min_,
|
|
18
|
+
pow,
|
|
19
|
+
random,
|
|
20
|
+
sub,
|
|
21
|
+
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForFloat<
|
|
22
|
+
ElementType,
|
|
23
|
+
number,
|
|
24
|
+
0
|
|
25
|
+
>({
|
|
26
|
+
MIN_VALUE: Number.MAX_VALUE * -1,
|
|
27
|
+
MAX_VALUE: 0,
|
|
28
|
+
typeNameInMessage,
|
|
29
|
+
} as const);
|
|
30
|
+
|
|
31
|
+
const floor = (
|
|
32
|
+
x: ElementType,
|
|
33
|
+
): TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
34
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
35
|
+
> =>
|
|
36
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
37
|
+
Math.floor(
|
|
38
|
+
x,
|
|
39
|
+
) as TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
40
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
const ceil = (
|
|
44
|
+
x: ElementType,
|
|
45
|
+
): TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
46
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
47
|
+
> =>
|
|
48
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
49
|
+
Math.ceil(x) as TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
50
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
51
|
+
>;
|
|
52
|
+
|
|
53
|
+
const round = (
|
|
54
|
+
x: ElementType,
|
|
55
|
+
): TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
56
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
57
|
+
> =>
|
|
58
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
59
|
+
Math.round(
|
|
60
|
+
x,
|
|
61
|
+
) as TsDataForgeInternals.RefinedNumberUtils.RemoveNonZeroBrandKey<
|
|
62
|
+
TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>
|
|
63
|
+
>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Checks if a number is a NonPositiveFiniteNumber (a finite number <= 0).
|
|
67
|
+
*
|
|
68
|
+
* @param value The value to check.
|
|
69
|
+
* @returns `true` if the value is a NonPositiveFiniteNumber, `false` otherwise.
|
|
70
|
+
*/
|
|
71
|
+
export const isNonPositiveFiniteNumber = is;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Casts a number to a NonPositiveFiniteNumber type.
|
|
75
|
+
*
|
|
76
|
+
* @param value The value to cast.
|
|
77
|
+
* @returns The value as a NonPositiveFiniteNumber type.
|
|
78
|
+
* @throws {TypeError} If the value is not a non-positive finite number.
|
|
79
|
+
*/
|
|
80
|
+
export const asNonPositiveFiniteNumber = castType;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Namespace providing type-safe arithmetic operations for non-positive finite
|
|
84
|
+
* numbers.
|
|
85
|
+
*
|
|
86
|
+
* All operations maintain the non-positive constraint by clamping positive
|
|
87
|
+
* results to MAX_VALUE (0), while ensuring results remain finite (excluding NaN
|
|
88
|
+
* and Infinity). This type is useful for representing quantities that must
|
|
89
|
+
* always be non-positive, such as debts, penalties, and negative offsets.
|
|
90
|
+
*/
|
|
91
|
+
export const NonPositiveFiniteNumber = {
|
|
92
|
+
/**
|
|
93
|
+
* Type guard to check if a value is a NonPositiveFiniteNumber.
|
|
94
|
+
*
|
|
95
|
+
* @param value The value to check.
|
|
96
|
+
* @returns `true` if the value is a non-positive finite number, `false`
|
|
97
|
+
* otherwise.
|
|
98
|
+
*/
|
|
99
|
+
is,
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The maximum value for a non-positive finite number.
|
|
103
|
+
*
|
|
104
|
+
* @readonly
|
|
105
|
+
*/
|
|
106
|
+
MAX_VALUE,
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Returns the smaller of two NonPositiveFiniteNumber values.
|
|
110
|
+
*
|
|
111
|
+
* @param a The first NonPositiveFiniteNumber.
|
|
112
|
+
* @param b The second NonPositiveFiniteNumber.
|
|
113
|
+
* @returns The minimum value as a NonPositiveFiniteNumber.
|
|
114
|
+
*/
|
|
115
|
+
min: min_,
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Returns the larger of two NonPositiveFiniteNumber values.
|
|
119
|
+
*
|
|
120
|
+
* @param a The first NonPositiveFiniteNumber.
|
|
121
|
+
* @param b The second NonPositiveFiniteNumber.
|
|
122
|
+
* @returns The maximum value as a NonPositiveFiniteNumber.
|
|
123
|
+
*/
|
|
124
|
+
max: max_,
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Clamps a number to the non-positive finite range.
|
|
128
|
+
*
|
|
129
|
+
* @param value The number to clamp.
|
|
130
|
+
* @returns The value clamped to (-∞, 0] as a NonPositiveFiniteNumber.
|
|
131
|
+
*/
|
|
132
|
+
clamp,
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Rounds down a NonPositiveFiniteNumber to the nearest integer.
|
|
136
|
+
*
|
|
137
|
+
* @param x The NonPositiveFiniteNumber to round down.
|
|
138
|
+
* @returns The floor value as a NonPositiveInt (can be 0).
|
|
139
|
+
*/
|
|
140
|
+
floor,
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Rounds up a NonPositiveFiniteNumber to the nearest integer.
|
|
144
|
+
*
|
|
145
|
+
* @param x The NonPositiveFiniteNumber to round up.
|
|
146
|
+
* @returns The ceiling value as a NegativeInt (always <= -1) or 0.
|
|
147
|
+
*/
|
|
148
|
+
ceil,
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Rounds a NonPositiveFiniteNumber to the nearest integer.
|
|
152
|
+
*
|
|
153
|
+
* @param x The NonPositiveFiniteNumber to round.
|
|
154
|
+
* @returns The rounded value as a NonPositiveInt (can be 0 if x > -0.5).
|
|
155
|
+
*/
|
|
156
|
+
round,
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Generates a random NonPositiveFiniteNumber value.
|
|
160
|
+
*
|
|
161
|
+
* @returns A random non-positive finite number.
|
|
162
|
+
*/
|
|
163
|
+
random,
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Raises a NonPositiveFiniteNumber to the power of another NonPositiveFiniteNumber.
|
|
167
|
+
*
|
|
168
|
+
* @param a The base NonPositiveFiniteNumber.
|
|
169
|
+
* @param b The exponent NonPositiveFiniteNumber.
|
|
170
|
+
* @returns `a ** b` clamped to (-∞, 0] as a NonPositiveFiniteNumber.
|
|
171
|
+
*/
|
|
172
|
+
pow,
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Adds two NonPositiveFiniteNumber values.
|
|
176
|
+
*
|
|
177
|
+
* @param a The first NonPositiveFiniteNumber.
|
|
178
|
+
* @param b The second NonPositiveFiniteNumber.
|
|
179
|
+
* @returns `a + b` clamped to (-∞, 0] as a NonPositiveFiniteNumber.
|
|
180
|
+
*/
|
|
181
|
+
add,
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Subtracts one NonPositiveFiniteNumber from another.
|
|
185
|
+
*
|
|
186
|
+
* @param a The minuend NonPositiveFiniteNumber.
|
|
187
|
+
* @param b The subtrahend NonPositiveFiniteNumber.
|
|
188
|
+
* @returns `a - b` clamped to (-∞, 0] as a NonPositiveFiniteNumber (maximum 0).
|
|
189
|
+
*/
|
|
190
|
+
sub,
|
|
191
|
+
} as const;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { expectType } from '../../expect-type.mjs';
|
|
2
|
+
import { range } from '../../iterator/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
asNonPositiveFiniteNumber,
|
|
5
|
+
isNonPositiveFiniteNumber,
|
|
6
|
+
NonPositiveFiniteNumber,
|
|
7
|
+
} from './non-positive-finite-number.mjs';
|
|
8
|
+
|
|
9
|
+
describe('NonPositiveFiniteNumber test', () => {
|
|
10
|
+
describe(asNonPositiveFiniteNumber, () => {
|
|
11
|
+
test('accepts valid non-positive finite numbers', () => {
|
|
12
|
+
expect(() => asNonPositiveFiniteNumber(0)).not.toThrow();
|
|
13
|
+
|
|
14
|
+
expect(() => asNonPositiveFiniteNumber(-1)).not.toThrow();
|
|
15
|
+
|
|
16
|
+
expect(() => asNonPositiveFiniteNumber(-3.14)).not.toThrow();
|
|
17
|
+
|
|
18
|
+
expect(() => asNonPositiveFiniteNumber(-0.5)).not.toThrow();
|
|
19
|
+
|
|
20
|
+
expect(() =>
|
|
21
|
+
asNonPositiveFiniteNumber(Number.MIN_VALUE * -1),
|
|
22
|
+
).not.toThrow();
|
|
23
|
+
|
|
24
|
+
expect(() =>
|
|
25
|
+
asNonPositiveFiniteNumber(Number.MAX_VALUE * -1),
|
|
26
|
+
).not.toThrow();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('rejects positive numbers', () => {
|
|
30
|
+
expect(() => asNonPositiveFiniteNumber(1)).toThrow(TypeError);
|
|
31
|
+
|
|
32
|
+
expect(() => asNonPositiveFiniteNumber(0.1)).toThrow(TypeError);
|
|
33
|
+
|
|
34
|
+
expect(() => asNonPositiveFiniteNumber(Number.MAX_VALUE)).toThrow(
|
|
35
|
+
TypeError,
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('rejects non-finite numbers', () => {
|
|
40
|
+
expect(() => asNonPositiveFiniteNumber(Number.NaN)).toThrow(TypeError);
|
|
41
|
+
|
|
42
|
+
expect(() => asNonPositiveFiniteNumber(Number.POSITIVE_INFINITY)).toThrow(
|
|
43
|
+
TypeError,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
expect(() => asNonPositiveFiniteNumber(Number.NEGATIVE_INFINITY)).toThrow(
|
|
47
|
+
TypeError,
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('returns the same value for valid inputs', () => {
|
|
52
|
+
expect(asNonPositiveFiniteNumber(0)).toBe(0);
|
|
53
|
+
|
|
54
|
+
expect(asNonPositiveFiniteNumber(-5.5)).toBe(-5.5);
|
|
55
|
+
|
|
56
|
+
expect(asNonPositiveFiniteNumber(-1000)).toBe(-1000);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe(isNonPositiveFiniteNumber, () => {
|
|
61
|
+
test('correctly identifies non-positive finite numbers', () => {
|
|
62
|
+
assert.isTrue(isNonPositiveFiniteNumber(0));
|
|
63
|
+
|
|
64
|
+
assert.isTrue(isNonPositiveFiniteNumber(-1));
|
|
65
|
+
|
|
66
|
+
assert.isTrue(isNonPositiveFiniteNumber(-3.14));
|
|
67
|
+
|
|
68
|
+
assert.isTrue(isNonPositiveFiniteNumber(-0.5));
|
|
69
|
+
|
|
70
|
+
assert.isTrue(isNonPositiveFiniteNumber(Number.MIN_VALUE * -1));
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('correctly rejects positive numbers', () => {
|
|
74
|
+
assert.isFalse(isNonPositiveFiniteNumber(1));
|
|
75
|
+
|
|
76
|
+
assert.isFalse(isNonPositiveFiniteNumber(0.1));
|
|
77
|
+
|
|
78
|
+
assert.isFalse(isNonPositiveFiniteNumber(Number.MAX_VALUE));
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('correctly rejects non-finite numbers', () => {
|
|
82
|
+
assert.isFalse(isNonPositiveFiniteNumber(Number.NaN));
|
|
83
|
+
|
|
84
|
+
assert.isFalse(isNonPositiveFiniteNumber(Number.POSITIVE_INFINITY));
|
|
85
|
+
|
|
86
|
+
assert.isFalse(isNonPositiveFiniteNumber(Number.NEGATIVE_INFINITY));
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('NonPositiveFiniteNumber.is', () => {
|
|
91
|
+
test('works as a type guard', () => {
|
|
92
|
+
const value: number = -42.5;
|
|
93
|
+
|
|
94
|
+
if (NonPositiveFiniteNumber.is(value)) {
|
|
95
|
+
expectType<typeof value, typeof value & NonPositiveFiniteNumber>('=');
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('NonPositiveFiniteNumber.MAX_VALUE', () => {
|
|
101
|
+
test('is 0', () => {
|
|
102
|
+
expect(NonPositiveFiniteNumber.MAX_VALUE).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('NonPositiveFiniteNumber.min', () => {
|
|
107
|
+
test('returns the smaller value', () => {
|
|
108
|
+
expect(
|
|
109
|
+
NonPositiveFiniteNumber.min(
|
|
110
|
+
asNonPositiveFiniteNumber(-5.5),
|
|
111
|
+
asNonPositiveFiniteNumber(-10.5),
|
|
112
|
+
),
|
|
113
|
+
).toBe(-10.5);
|
|
114
|
+
|
|
115
|
+
expect(
|
|
116
|
+
NonPositiveFiniteNumber.min(
|
|
117
|
+
asNonPositiveFiniteNumber(0),
|
|
118
|
+
asNonPositiveFiniteNumber(-1.5),
|
|
119
|
+
),
|
|
120
|
+
).toBe(-1.5);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('NonPositiveFiniteNumber.max', () => {
|
|
125
|
+
test('returns the larger value', () => {
|
|
126
|
+
expect(
|
|
127
|
+
NonPositiveFiniteNumber.max(
|
|
128
|
+
asNonPositiveFiniteNumber(-5.5),
|
|
129
|
+
asNonPositiveFiniteNumber(-10.5),
|
|
130
|
+
),
|
|
131
|
+
).toBe(-5.5);
|
|
132
|
+
|
|
133
|
+
expect(
|
|
134
|
+
NonPositiveFiniteNumber.max(
|
|
135
|
+
asNonPositiveFiniteNumber(-1.5),
|
|
136
|
+
asNonPositiveFiniteNumber(0),
|
|
137
|
+
),
|
|
138
|
+
).toBe(0);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe('NonPositiveFiniteNumber.clamp', () => {
|
|
143
|
+
test('returns the same value if within range', () => {
|
|
144
|
+
expect(NonPositiveFiniteNumber.clamp(-5.5)).toBe(-5.5);
|
|
145
|
+
|
|
146
|
+
expect(NonPositiveFiniteNumber.clamp(0)).toBe(0);
|
|
147
|
+
|
|
148
|
+
expect(NonPositiveFiniteNumber.clamp(-1000.5)).toBe(-1000.5);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('clamps positive values to MAX_VALUE (0)', () => {
|
|
152
|
+
expect(NonPositiveFiniteNumber.clamp(5.5)).toBe(0);
|
|
153
|
+
|
|
154
|
+
expect(NonPositiveFiniteNumber.clamp(1000)).toBe(0);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test('clamps -Infinity to the lower bound', () => {
|
|
158
|
+
expect(NonPositiveFiniteNumber.clamp(Number.NEGATIVE_INFINITY)).toBe(
|
|
159
|
+
-Number.MAX_VALUE,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('NonPositiveFiniteNumber.floor', () => {
|
|
165
|
+
test('rounds down non-positive finite numbers', () => {
|
|
166
|
+
expect(
|
|
167
|
+
NonPositiveFiniteNumber.floor(asNonPositiveFiniteNumber(-5.9)),
|
|
168
|
+
).toBe(-6);
|
|
169
|
+
|
|
170
|
+
expect(
|
|
171
|
+
NonPositiveFiniteNumber.floor(asNonPositiveFiniteNumber(-0.1)),
|
|
172
|
+
).toBe(-1);
|
|
173
|
+
|
|
174
|
+
expect(NonPositiveFiniteNumber.floor(asNonPositiveFiniteNumber(0))).toBe(
|
|
175
|
+
0,
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
describe('NonPositiveFiniteNumber.ceil', () => {
|
|
181
|
+
test('rounds up non-positive finite numbers', () => {
|
|
182
|
+
expect(
|
|
183
|
+
NonPositiveFiniteNumber.ceil(asNonPositiveFiniteNumber(-5.1)),
|
|
184
|
+
).toBe(-5);
|
|
185
|
+
|
|
186
|
+
expect(
|
|
187
|
+
NonPositiveFiniteNumber.ceil(asNonPositiveFiniteNumber(-0.9)),
|
|
188
|
+
).toBeCloseTo(0);
|
|
189
|
+
|
|
190
|
+
expect(NonPositiveFiniteNumber.ceil(asNonPositiveFiniteNumber(0))).toBe(
|
|
191
|
+
0,
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('NonPositiveFiniteNumber.round', () => {
|
|
197
|
+
test('rounds non-positive finite numbers', () => {
|
|
198
|
+
expect(
|
|
199
|
+
NonPositiveFiniteNumber.round(asNonPositiveFiniteNumber(-5.6)),
|
|
200
|
+
).toBe(-6);
|
|
201
|
+
|
|
202
|
+
expect(
|
|
203
|
+
NonPositiveFiniteNumber.round(asNonPositiveFiniteNumber(-0.4)),
|
|
204
|
+
).toBeCloseTo(0);
|
|
205
|
+
|
|
206
|
+
expect(
|
|
207
|
+
NonPositiveFiniteNumber.round(asNonPositiveFiniteNumber(-1.5)),
|
|
208
|
+
).toBe(-1);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe('NonPositiveFiniteNumber.add', () => {
|
|
213
|
+
test('adds two non-positive finite numbers', () => {
|
|
214
|
+
expect(
|
|
215
|
+
NonPositiveFiniteNumber.add(
|
|
216
|
+
asNonPositiveFiniteNumber(-5.5),
|
|
217
|
+
asNonPositiveFiniteNumber(-3.2),
|
|
218
|
+
),
|
|
219
|
+
).toBeCloseTo(-8.7, 5);
|
|
220
|
+
|
|
221
|
+
expect(
|
|
222
|
+
NonPositiveFiniteNumber.add(
|
|
223
|
+
asNonPositiveFiniteNumber(0),
|
|
224
|
+
asNonPositiveFiniteNumber(-10.5),
|
|
225
|
+
),
|
|
226
|
+
).toBe(-10.5);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test('returns 0 at the upper boundary', () => {
|
|
230
|
+
expect(
|
|
231
|
+
NonPositiveFiniteNumber.add(
|
|
232
|
+
asNonPositiveFiniteNumber(0),
|
|
233
|
+
asNonPositiveFiniteNumber(0),
|
|
234
|
+
),
|
|
235
|
+
).toBe(0);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('NonPositiveFiniteNumber.sub', () => {
|
|
240
|
+
test('subtracts two non-positive finite numbers', () => {
|
|
241
|
+
expect(
|
|
242
|
+
NonPositiveFiniteNumber.sub(
|
|
243
|
+
asNonPositiveFiniteNumber(-10.5),
|
|
244
|
+
asNonPositiveFiniteNumber(-3.2),
|
|
245
|
+
),
|
|
246
|
+
).toBeCloseTo(-7.3, 5);
|
|
247
|
+
|
|
248
|
+
expect(
|
|
249
|
+
NonPositiveFiniteNumber.sub(
|
|
250
|
+
asNonPositiveFiniteNumber(0),
|
|
251
|
+
asNonPositiveFiniteNumber(-5.5),
|
|
252
|
+
),
|
|
253
|
+
).toBe(0);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test('clamps result to MAX_VALUE (0) when result is positive', () => {
|
|
257
|
+
expect(
|
|
258
|
+
NonPositiveFiniteNumber.sub(
|
|
259
|
+
asNonPositiveFiniteNumber(-3),
|
|
260
|
+
asNonPositiveFiniteNumber(-10),
|
|
261
|
+
),
|
|
262
|
+
).toBe(0);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
describe('NonPositiveFiniteNumber.pow', () => {
|
|
267
|
+
test('raises to power', () => {
|
|
268
|
+
expect(
|
|
269
|
+
NonPositiveFiniteNumber.pow(
|
|
270
|
+
asNonPositiveFiniteNumber(-2),
|
|
271
|
+
asNonPositiveFiniteNumber(-1),
|
|
272
|
+
),
|
|
273
|
+
).toBeDefined();
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
describe('NonPositiveFiniteNumber.random', () => {
|
|
278
|
+
test('generates values within range', () => {
|
|
279
|
+
for (const _ of range(100)) {
|
|
280
|
+
const value = NonPositiveFiniteNumber.random();
|
|
281
|
+
|
|
282
|
+
assert.isTrue(isNonPositiveFiniteNumber(value));
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
});
|