@fncts/test 0.0.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.
- package/TestSpec.d.ts +4 -0
- package/_cjs/api.cjs +91 -0
- package/_cjs/api.cjs.map +1 -0
- package/_cjs/control/AbstractRunnableSpec.cjs +30 -0
- package/_cjs/control/AbstractRunnableSpec.cjs.map +1 -0
- package/_cjs/control/Annotations/api.cjs +50 -0
- package/_cjs/control/Annotations/api.cjs.map +1 -0
- package/_cjs/control/Annotations/definition.cjs +27 -0
- package/_cjs/control/Annotations/definition.cjs.map +1 -0
- package/_cjs/control/Annotations/live.cjs +68 -0
- package/_cjs/control/Annotations/live.cjs.map +1 -0
- package/_cjs/control/Annotations.cjs +45 -0
- package/_cjs/control/Annotations.cjs.map +1 -0
- package/_cjs/control/Assertion/api.cjs +256 -0
- package/_cjs/control/Assertion/api.cjs.map +1 -0
- package/_cjs/control/Assertion/definition.cjs +32 -0
- package/_cjs/control/Assertion/definition.cjs.map +1 -0
- package/_cjs/control/Assertion.cjs +32 -0
- package/_cjs/control/Assertion.cjs.map +1 -0
- package/_cjs/control/AssertionIO/api.cjs +46 -0
- package/_cjs/control/AssertionIO/api.cjs.map +1 -0
- package/_cjs/control/AssertionIO/definition.cjs +37 -0
- package/_cjs/control/AssertionIO/definition.cjs.map +1 -0
- package/_cjs/control/AssertionIO.cjs +32 -0
- package/_cjs/control/AssertionIO.cjs.map +1 -0
- package/_cjs/control/DefaultRunnableSpec.cjs +30 -0
- package/_cjs/control/DefaultRunnableSpec.cjs.map +1 -0
- package/_cjs/control/DefaultTestReporter/definition.cjs +9 -0
- package/_cjs/control/DefaultTestReporter/definition.cjs.map +1 -0
- package/_cjs/control/DefaultTestReporter/render.cjs +288 -0
- package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -0
- package/_cjs/control/DefaultTestReporter.cjs +32 -0
- package/_cjs/control/DefaultTestReporter.cjs.map +1 -0
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs +89 -0
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -0
- package/_cjs/control/FreeBooleanAlgebraIO/definition.cjs +9 -0
- package/_cjs/control/FreeBooleanAlgebraIO/definition.cjs.map +1 -0
- package/_cjs/control/FreeBooleanAlgebraIO.cjs +32 -0
- package/_cjs/control/FreeBooleanAlgebraIO.cjs.map +1 -0
- package/_cjs/control/Gen/api/array.cjs +50 -0
- package/_cjs/control/Gen/api/array.cjs.map +1 -0
- package/_cjs/control/Gen/api/char.cjs +129 -0
- package/_cjs/control/Gen/api/char.cjs.map +1 -0
- package/_cjs/control/Gen/api/conc.cjs +70 -0
- package/_cjs/control/Gen/api/conc.cjs.map +1 -0
- package/_cjs/control/Gen/api/double.cjs +82 -0
- package/_cjs/control/Gen/api/double.cjs.map +1 -0
- package/_cjs/control/Gen/api/float.cjs +55 -0
- package/_cjs/control/Gen/api/float.cjs.map +1 -0
- package/_cjs/control/Gen/api/string.cjs +102 -0
- package/_cjs/control/Gen/api/string.cjs.map +1 -0
- package/_cjs/control/Gen/api/struct.cjs +36 -0
- package/_cjs/control/Gen/api/struct.cjs.map +1 -0
- package/_cjs/control/Gen/api.cjs +369 -0
- package/_cjs/control/Gen/api.cjs.map +1 -0
- package/_cjs/control/Gen/constraints.cjs +6 -0
- package/_cjs/control/Gen/constraints.cjs.map +1 -0
- package/_cjs/control/Gen/definition.cjs +20 -0
- package/_cjs/control/Gen/definition.cjs.map +1 -0
- package/_cjs/control/Gen.cjs +136 -0
- package/_cjs/control/Gen.cjs.map +1 -0
- package/_cjs/control/Live/definition.cjs +67 -0
- package/_cjs/control/Live/definition.cjs.map +1 -0
- package/_cjs/control/Live.cjs +19 -0
- package/_cjs/control/Live.cjs.map +1 -0
- package/_cjs/control/RunnableSpec.cjs +70 -0
- package/_cjs/control/RunnableSpec.cjs.map +1 -0
- package/_cjs/control/Sample/api.cjs +244 -0
- package/_cjs/control/Sample/api.cjs.map +1 -0
- package/_cjs/control/Sample/definition.cjs +21 -0
- package/_cjs/control/Sample/definition.cjs.map +1 -0
- package/_cjs/control/Sample.cjs +32 -0
- package/_cjs/control/Sample.cjs.map +1 -0
- package/_cjs/control/Sized/api.cjs +32 -0
- package/_cjs/control/Sized/api.cjs.map +1 -0
- package/_cjs/control/Sized/definition.cjs +27 -0
- package/_cjs/control/Sized/definition.cjs.map +1 -0
- package/_cjs/control/Sized/live.cjs +42 -0
- package/_cjs/control/Sized/live.cjs.map +1 -0
- package/_cjs/control/Sized.cjs +45 -0
- package/_cjs/control/Sized.cjs.map +1 -0
- package/_cjs/control/Spec/api.cjs +525 -0
- package/_cjs/control/Spec/api.cjs.map +1 -0
- package/_cjs/control/Spec/definition.cjs +125 -0
- package/_cjs/control/Spec/definition.cjs.map +1 -0
- package/_cjs/control/Spec.cjs +32 -0
- package/_cjs/control/Spec.cjs.map +1 -0
- package/_cjs/control/SummaryBuilder.cjs +87 -0
- package/_cjs/control/SummaryBuilder.cjs.map +1 -0
- package/_cjs/control/Test.cjs +34 -0
- package/_cjs/control/Test.cjs.map +1 -0
- package/_cjs/control/TestAnnotationRenderer/api.cjs +101 -0
- package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -0
- package/_cjs/control/TestAnnotationRenderer/definition.cjs +53 -0
- package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -0
- package/_cjs/control/TestAnnotationRenderer.cjs +32 -0
- package/_cjs/control/TestAnnotationRenderer.cjs.map +1 -0
- package/_cjs/control/TestAspect/api.cjs +148 -0
- package/_cjs/control/TestAspect/api.cjs.map +1 -0
- package/_cjs/control/TestAspect/definition.cjs +6 -0
- package/_cjs/control/TestAspect/definition.cjs.map +1 -0
- package/_cjs/control/TestAspect.cjs +32 -0
- package/_cjs/control/TestAspect.cjs.map +1 -0
- package/_cjs/control/TestClock/api.cjs +72 -0
- package/_cjs/control/TestClock/api.cjs.map +1 -0
- package/_cjs/control/TestClock/definition.cjs +225 -0
- package/_cjs/control/TestClock/definition.cjs.map +1 -0
- package/_cjs/control/TestClock.cjs +32 -0
- package/_cjs/control/TestClock.cjs.map +1 -0
- package/_cjs/control/TestConsole/api.cjs +64 -0
- package/_cjs/control/TestConsole/api.cjs.map +1 -0
- package/_cjs/control/TestConsole/definition.cjs +100 -0
- package/_cjs/control/TestConsole/definition.cjs.map +1 -0
- package/_cjs/control/TestConsole.cjs +32 -0
- package/_cjs/control/TestConsole.cjs.map +1 -0
- package/_cjs/control/TestEnvironment.cjs +39 -0
- package/_cjs/control/TestEnvironment.cjs.map +1 -0
- package/_cjs/control/TestExecutor.cjs +58 -0
- package/_cjs/control/TestExecutor.cjs.map +1 -0
- package/_cjs/control/TestLogger.cjs +58 -0
- package/_cjs/control/TestLogger.cjs.map +1 -0
- package/_cjs/control/TestRandom/api.cjs +125 -0
- package/_cjs/control/TestRandom/api.cjs.map +1 -0
- package/_cjs/control/TestRandom/definition.cjs +458 -0
- package/_cjs/control/TestRandom/definition.cjs.map +1 -0
- package/_cjs/control/TestRandom.cjs +32 -0
- package/_cjs/control/TestRandom.cjs.map +1 -0
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +113 -0
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -0
- package/_cjs/control/TestRenderer/definition.cjs +6 -0
- package/_cjs/control/TestRenderer/definition.cjs.map +1 -0
- package/_cjs/control/TestRunner.cjs +45 -0
- package/_cjs/control/TestRunner.cjs.map +1 -0
- package/_cjs/data/AssertionData.cjs +55 -0
- package/_cjs/data/AssertionData.cjs.map +1 -0
- package/_cjs/data/AssertionResult.cjs +34 -0
- package/_cjs/data/AssertionResult.cjs.map +1 -0
- package/_cjs/data/AssertionValue/api.cjs +64 -0
- package/_cjs/data/AssertionValue/api.cjs.map +1 -0
- package/_cjs/data/AssertionValue/definition.cjs +35 -0
- package/_cjs/data/AssertionValue/definition.cjs.map +1 -0
- package/_cjs/data/AssertionValue.cjs +32 -0
- package/_cjs/data/AssertionValue.cjs.map +1 -0
- package/_cjs/data/ExecutedSpec/api.cjs +132 -0
- package/_cjs/data/ExecutedSpec/api.cjs.map +1 -0
- package/_cjs/data/ExecutedSpec/definition.cjs +58 -0
- package/_cjs/data/ExecutedSpec/definition.cjs.map +1 -0
- package/_cjs/data/ExecutedSpec.cjs +32 -0
- package/_cjs/data/ExecutedSpec.cjs.map +1 -0
- package/_cjs/data/ExecutionResult.cjs +142 -0
- package/_cjs/data/ExecutionResult.cjs.map +1 -0
- package/_cjs/data/FailureDetails.cjs +17 -0
- package/_cjs/data/FailureDetails.cjs.map +1 -0
- package/_cjs/data/FreeBooleanAlgebra/api.cjs +194 -0
- package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -0
- package/_cjs/data/FreeBooleanAlgebra/definition.cjs +59 -0
- package/_cjs/data/FreeBooleanAlgebra/definition.cjs.map +1 -0
- package/_cjs/data/FreeBooleanAlgebra.cjs +32 -0
- package/_cjs/data/FreeBooleanAlgebra.cjs.map +1 -0
- package/_cjs/data/GenFailureDetails.cjs +18 -0
- package/_cjs/data/GenFailureDetails.cjs.map +1 -0
- package/_cjs/data/LogLine/Fragment.cjs +94 -0
- package/_cjs/data/LogLine/Fragment.cjs.map +1 -0
- package/_cjs/data/LogLine/Line.cjs +142 -0
- package/_cjs/data/LogLine/Line.cjs.map +1 -0
- package/_cjs/data/LogLine/Message.cjs +145 -0
- package/_cjs/data/LogLine/Message.cjs.map +1 -0
- package/_cjs/data/LogLine/Style.cjs +124 -0
- package/_cjs/data/LogLine/Style.cjs.map +1 -0
- package/_cjs/data/LogLine/api.cjs +65 -0
- package/_cjs/data/LogLine/api.cjs.map +1 -0
- package/_cjs/data/LogLine.cjs +32 -0
- package/_cjs/data/LogLine.cjs.map +1 -0
- package/_cjs/data/Render/api.cjs +25 -0
- package/_cjs/data/Render/api.cjs.map +1 -0
- package/_cjs/data/Render/definition.cjs +52 -0
- package/_cjs/data/Render/definition.cjs.map +1 -0
- package/_cjs/data/Render.cjs +32 -0
- package/_cjs/data/Render.cjs.map +1 -0
- package/_cjs/data/RenderParam/api.cjs +40 -0
- package/_cjs/data/RenderParam/api.cjs.map +1 -0
- package/_cjs/data/RenderParam/definition.cjs +33 -0
- package/_cjs/data/RenderParam/definition.cjs.map +1 -0
- package/_cjs/data/RenderParam.cjs +32 -0
- package/_cjs/data/RenderParam.cjs.map +1 -0
- package/_cjs/data/Summary.cjs +20 -0
- package/_cjs/data/Summary.cjs.map +1 -0
- package/_cjs/data/TestAnnotation/api.cjs +76 -0
- package/_cjs/data/TestAnnotation/api.cjs.map +1 -0
- package/_cjs/data/TestAnnotation/definition.cjs +55 -0
- package/_cjs/data/TestAnnotation/definition.cjs.map +1 -0
- package/_cjs/data/TestAnnotation.cjs +32 -0
- package/_cjs/data/TestAnnotation.cjs.map +1 -0
- package/_cjs/data/TestAnnotationMap.cjs +51 -0
- package/_cjs/data/TestAnnotationMap.cjs.map +1 -0
- package/_cjs/data/TestArgs/definition.cjs +18 -0
- package/_cjs/data/TestArgs/definition.cjs.map +1 -0
- package/_cjs/data/TestArgs.cjs +19 -0
- package/_cjs/data/TestArgs.cjs.map +1 -0
- package/_cjs/data/TestConfig.cjs +76 -0
- package/_cjs/data/TestConfig.cjs.map +1 -0
- package/_cjs/data/TestFailure.cjs +75 -0
- package/_cjs/data/TestFailure.cjs.map +1 -0
- package/_cjs/data/TestSuccess.cjs +48 -0
- package/_cjs/data/TestSuccess.cjs.map +1 -0
- package/_cjs/data/TestTimeoutException.cjs +16 -0
- package/_cjs/data/TestTimeoutException.cjs.map +1 -0
- package/_cjs/demo.cjs +44 -0
- package/_cjs/demo.cjs.map +1 -0
- package/_cjs/util/math.cjs +673 -0
- package/_cjs/util/math.cjs.map +1 -0
- package/_mjs/api.mjs +57 -0
- package/_mjs/api.mjs.map +1 -0
- package/_mjs/control/AbstractRunnableSpec.mjs +16 -0
- package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -0
- package/_mjs/control/Annotations/api.mjs +30 -0
- package/_mjs/control/Annotations/api.mjs.map +1 -0
- package/_mjs/control/Annotations/definition.mjs +13 -0
- package/_mjs/control/Annotations/definition.mjs.map +1 -0
- package/_mjs/control/Annotations/live.mjs +40 -0
- package/_mjs/control/Annotations/live.mjs.map +1 -0
- package/_mjs/control/Annotations.mjs +5 -0
- package/_mjs/control/Annotations.mjs.map +1 -0
- package/_mjs/control/Assertion/api.mjs +170 -0
- package/_mjs/control/Assertion/api.mjs.map +1 -0
- package/_mjs/control/Assertion/definition.mjs +17 -0
- package/_mjs/control/Assertion/definition.mjs.map +1 -0
- package/_mjs/control/Assertion.mjs +4 -0
- package/_mjs/control/Assertion.mjs.map +1 -0
- package/_mjs/control/AssertionIO/api.mjs +28 -0
- package/_mjs/control/AssertionIO/api.mjs.map +1 -0
- package/_mjs/control/AssertionIO/definition.mjs +23 -0
- package/_mjs/control/AssertionIO/definition.mjs.map +1 -0
- package/_mjs/control/AssertionIO.mjs +4 -0
- package/_mjs/control/AssertionIO.mjs.map +1 -0
- package/_mjs/control/DefaultRunnableSpec.mjs +15 -0
- package/_mjs/control/DefaultRunnableSpec.mjs.map +1 -0
- package/_mjs/control/DefaultTestReporter/definition.mjs +2 -0
- package/_mjs/control/DefaultTestReporter/definition.mjs.map +1 -0
- package/_mjs/control/DefaultTestReporter/render.mjs +245 -0
- package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -0
- package/_mjs/control/DefaultTestReporter.mjs +4 -0
- package/_mjs/control/DefaultTestReporter.mjs.map +1 -0
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs +62 -0
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -0
- package/_mjs/control/FreeBooleanAlgebraIO/definition.mjs +2 -0
- package/_mjs/control/FreeBooleanAlgebraIO/definition.mjs.map +1 -0
- package/_mjs/control/FreeBooleanAlgebraIO.mjs +4 -0
- package/_mjs/control/FreeBooleanAlgebraIO.mjs.map +1 -0
- package/_mjs/control/Gen/api/array.mjs +31 -0
- package/_mjs/control/Gen/api/array.mjs.map +1 -0
- package/_mjs/control/Gen/api/char.mjs +95 -0
- package/_mjs/control/Gen/api/char.mjs.map +1 -0
- package/_mjs/control/Gen/api/conc.mjs +46 -0
- package/_mjs/control/Gen/api/conc.mjs.map +1 -0
- package/_mjs/control/Gen/api/double.mjs +60 -0
- package/_mjs/control/Gen/api/double.mjs.map +1 -0
- package/_mjs/control/Gen/api/float.mjs +41 -0
- package/_mjs/control/Gen/api/float.mjs.map +1 -0
- package/_mjs/control/Gen/api/string.mjs +72 -0
- package/_mjs/control/Gen/api/string.mjs.map +1 -0
- package/_mjs/control/Gen/api/struct.mjs +18 -0
- package/_mjs/control/Gen/api/struct.mjs.map +1 -0
- package/_mjs/control/Gen/api.mjs +288 -0
- package/_mjs/control/Gen/api.mjs.map +1 -0
- package/_mjs/control/Gen/constraints.mjs +2 -0
- package/_mjs/control/Gen/constraints.mjs.map +1 -0
- package/_mjs/control/Gen/definition.mjs +11 -0
- package/_mjs/control/Gen/definition.mjs.map +1 -0
- package/_mjs/control/Gen.mjs +14 -0
- package/_mjs/control/Gen.mjs.map +1 -0
- package/_mjs/control/Live/definition.mjs +42 -0
- package/_mjs/control/Live/definition.mjs.map +1 -0
- package/_mjs/control/Live.mjs +3 -0
- package/_mjs/control/Live.mjs.map +1 -0
- package/_mjs/control/RunnableSpec.mjs +44 -0
- package/_mjs/control/RunnableSpec.mjs.map +1 -0
- package/_mjs/control/Sample/api.mjs +195 -0
- package/_mjs/control/Sample/api.mjs.map +1 -0
- package/_mjs/control/Sample/definition.mjs +12 -0
- package/_mjs/control/Sample/definition.mjs.map +1 -0
- package/_mjs/control/Sample.mjs +4 -0
- package/_mjs/control/Sample.mjs.map +1 -0
- package/_mjs/control/Sized/api.mjs +16 -0
- package/_mjs/control/Sized/api.mjs.map +1 -0
- package/_mjs/control/Sized/definition.mjs +13 -0
- package/_mjs/control/Sized/definition.mjs.map +1 -0
- package/_mjs/control/Sized/live.mjs +25 -0
- package/_mjs/control/Sized/live.mjs.map +1 -0
- package/_mjs/control/Sized.mjs +5 -0
- package/_mjs/control/Sized.mjs.map +1 -0
- package/_mjs/control/Spec/api.mjs +449 -0
- package/_mjs/control/Spec/api.mjs.map +1 -0
- package/_mjs/control/Spec/definition.mjs +96 -0
- package/_mjs/control/Spec/definition.mjs.map +1 -0
- package/_mjs/control/Spec.mjs +4 -0
- package/_mjs/control/Spec.mjs.map +1 -0
- package/_mjs/control/SummaryBuilder.mjs +61 -0
- package/_mjs/control/SummaryBuilder.mjs.map +1 -0
- package/_mjs/control/Test.mjs +15 -0
- package/_mjs/control/Test.mjs.map +1 -0
- package/_mjs/control/TestAnnotationRenderer/api.mjs +74 -0
- package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -0
- package/_mjs/control/TestAnnotationRenderer/definition.mjs +32 -0
- package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -0
- package/_mjs/control/TestAnnotationRenderer.mjs +4 -0
- package/_mjs/control/TestAnnotationRenderer.mjs.map +1 -0
- package/_mjs/control/TestAspect/api.mjs +93 -0
- package/_mjs/control/TestAspect/api.mjs.map +1 -0
- package/_mjs/control/TestAspect/definition.mjs +2 -0
- package/_mjs/control/TestAspect/definition.mjs.map +1 -0
- package/_mjs/control/TestAspect.mjs +4 -0
- package/_mjs/control/TestAspect.mjs.map +1 -0
- package/_mjs/control/TestClock/api.mjs +45 -0
- package/_mjs/control/TestClock/api.mjs.map +1 -0
- package/_mjs/control/TestClock/definition.mjs +173 -0
- package/_mjs/control/TestClock/definition.mjs.map +1 -0
- package/_mjs/control/TestClock.mjs +4 -0
- package/_mjs/control/TestClock.mjs.map +1 -0
- package/_mjs/control/TestConsole/api.mjs +41 -0
- package/_mjs/control/TestConsole/api.mjs.map +1 -0
- package/_mjs/control/TestConsole/definition.mjs +73 -0
- package/_mjs/control/TestConsole/definition.mjs.map +1 -0
- package/_mjs/control/TestConsole.mjs +4 -0
- package/_mjs/control/TestConsole.mjs.map +1 -0
- package/_mjs/control/TestEnvironment.mjs +17 -0
- package/_mjs/control/TestEnvironment.mjs.map +1 -0
- package/_mjs/control/TestExecutor.mjs +36 -0
- package/_mjs/control/TestExecutor.mjs.map +1 -0
- package/_mjs/control/TestLogger.mjs +36 -0
- package/_mjs/control/TestLogger.mjs.map +1 -0
- package/_mjs/control/TestRandom/api.mjs +87 -0
- package/_mjs/control/TestRandom/api.mjs.map +1 -0
- package/_mjs/control/TestRandom/definition.mjs +418 -0
- package/_mjs/control/TestRandom/definition.mjs.map +1 -0
- package/_mjs/control/TestRandom.mjs +4 -0
- package/_mjs/control/TestRandom.mjs.map +1 -0
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +88 -0
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -0
- package/_mjs/control/TestRenderer/definition.mjs +2 -0
- package/_mjs/control/TestRenderer/definition.mjs.map +1 -0
- package/_mjs/control/TestRunner.mjs +23 -0
- package/_mjs/control/TestRunner.mjs.map +1 -0
- package/_mjs/data/AssertionData.mjs +34 -0
- package/_mjs/data/AssertionData.mjs.map +1 -0
- package/_mjs/data/AssertionResult.mjs +17 -0
- package/_mjs/data/AssertionResult.mjs.map +1 -0
- package/_mjs/data/AssertionValue/api.mjs +42 -0
- package/_mjs/data/AssertionValue/api.mjs.map +1 -0
- package/_mjs/data/AssertionValue/definition.mjs +19 -0
- package/_mjs/data/AssertionValue/definition.mjs.map +1 -0
- package/_mjs/data/AssertionValue.mjs +4 -0
- package/_mjs/data/AssertionValue.mjs.map +1 -0
- package/_mjs/data/ExecutedSpec/api.mjs +104 -0
- package/_mjs/data/ExecutedSpec/api.mjs.map +1 -0
- package/_mjs/data/ExecutedSpec/definition.mjs +40 -0
- package/_mjs/data/ExecutedSpec/definition.mjs.map +1 -0
- package/_mjs/data/ExecutedSpec.mjs +4 -0
- package/_mjs/data/ExecutedSpec.mjs.map +1 -0
- package/_mjs/data/ExecutionResult.mjs +110 -0
- package/_mjs/data/ExecutionResult.mjs.map +1 -0
- package/_mjs/data/FailureDetails.mjs +8 -0
- package/_mjs/data/FailureDetails.mjs.map +1 -0
- package/_mjs/data/FreeBooleanAlgebra/api.mjs +154 -0
- package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -0
- package/_mjs/data/FreeBooleanAlgebra/definition.mjs +40 -0
- package/_mjs/data/FreeBooleanAlgebra/definition.mjs.map +1 -0
- package/_mjs/data/FreeBooleanAlgebra.mjs +4 -0
- package/_mjs/data/FreeBooleanAlgebra.mjs.map +1 -0
- package/_mjs/data/GenFailureDetails.mjs +9 -0
- package/_mjs/data/GenFailureDetails.mjs.map +1 -0
- package/_mjs/data/LogLine/Fragment.mjs +65 -0
- package/_mjs/data/LogLine/Fragment.mjs.map +1 -0
- package/_mjs/data/LogLine/Line.mjs +104 -0
- package/_mjs/data/LogLine/Line.mjs.map +1 -0
- package/_mjs/data/LogLine/Message.mjs +107 -0
- package/_mjs/data/LogLine/Message.mjs.map +1 -0
- package/_mjs/data/LogLine/Style.mjs +101 -0
- package/_mjs/data/LogLine/Style.mjs.map +1 -0
- package/_mjs/data/LogLine/api.mjs +32 -0
- package/_mjs/data/LogLine/api.mjs.map +1 -0
- package/_mjs/data/LogLine.mjs +3 -0
- package/_mjs/data/LogLine.mjs.map +1 -0
- package/_mjs/data/Render/api.mjs +16 -0
- package/_mjs/data/Render/api.mjs.map +1 -0
- package/_mjs/data/Render/definition.mjs +33 -0
- package/_mjs/data/Render/definition.mjs.map +1 -0
- package/_mjs/data/Render.mjs +4 -0
- package/_mjs/data/Render.mjs.map +1 -0
- package/_mjs/data/RenderParam/api.mjs +28 -0
- package/_mjs/data/RenderParam/api.mjs.map +1 -0
- package/_mjs/data/RenderParam/definition.mjs +20 -0
- package/_mjs/data/RenderParam/definition.mjs.map +1 -0
- package/_mjs/data/RenderParam.mjs +4 -0
- package/_mjs/data/RenderParam.mjs.map +1 -0
- package/_mjs/data/Summary.mjs +11 -0
- package/_mjs/data/Summary.mjs.map +1 -0
- package/_mjs/data/TestAnnotation/api.mjs +47 -0
- package/_mjs/data/TestAnnotation/api.mjs.map +1 -0
- package/_mjs/data/TestAnnotation/definition.mjs +33 -0
- package/_mjs/data/TestAnnotation/definition.mjs.map +1 -0
- package/_mjs/data/TestAnnotation.mjs +4 -0
- package/_mjs/data/TestAnnotation.mjs.map +1 -0
- package/_mjs/data/TestAnnotationMap.mjs +33 -0
- package/_mjs/data/TestAnnotationMap.mjs.map +1 -0
- package/_mjs/data/TestArgs/definition.mjs +9 -0
- package/_mjs/data/TestArgs/definition.mjs.map +1 -0
- package/_mjs/data/TestArgs.mjs +3 -0
- package/_mjs/data/TestArgs.mjs.map +1 -0
- package/_mjs/data/TestConfig.mjs +52 -0
- package/_mjs/data/TestConfig.mjs.map +1 -0
- package/_mjs/data/TestFailure.mjs +49 -0
- package/_mjs/data/TestFailure.mjs.map +1 -0
- package/_mjs/data/TestSuccess.mjs +31 -0
- package/_mjs/data/TestSuccess.mjs.map +1 -0
- package/_mjs/data/TestTimeoutException.mjs +7 -0
- package/_mjs/data/TestTimeoutException.mjs.map +1 -0
- package/_mjs/demo.mjs +33 -0
- package/_mjs/demo.mjs.map +1 -0
- package/_mjs/util/math.mjs +604 -0
- package/_mjs/util/math.mjs.map +1 -0
- package/_src/api.ts +76 -0
- package/_src/control/AbstractRunnableSpec.ts +23 -0
- package/_src/control/Annotations/api.ts +33 -0
- package/_src/control/Annotations/definition.ts +20 -0
- package/_src/control/Annotations/live.ts +50 -0
- package/_src/control/Annotations.ts +5 -0
- package/_src/control/Assertion/api.ts +236 -0
- package/_src/control/Assertion/definition.ts +20 -0
- package/_src/control/Assertion.ts +4 -0
- package/_src/control/AssertionIO/api.ts +32 -0
- package/_src/control/AssertionIO/definition.ts +26 -0
- package/_src/control/AssertionIO.ts +4 -0
- package/_src/control/DefaultRunnableSpec.ts +12 -0
- package/_src/control/DefaultTestReporter/definition.ts +6 -0
- package/_src/control/DefaultTestReporter/render.ts +295 -0
- package/_src/control/DefaultTestReporter.ts +4 -0
- package/_src/control/FreeBooleanAlgebraIO/api.ts +67 -0
- package/_src/control/FreeBooleanAlgebraIO/definition.ts +13 -0
- package/_src/control/FreeBooleanAlgebraIO.ts +4 -0
- package/_src/control/Gen/api/array.ts +31 -0
- package/_src/control/Gen/api/char.ts +83 -0
- package/_src/control/Gen/api/conc.ts +50 -0
- package/_src/control/Gen/api/double.ts +64 -0
- package/_src/control/Gen/api/float.ts +36 -0
- package/_src/control/Gen/api/string.ts +71 -0
- package/_src/control/Gen/api/struct.ts +21 -0
- package/_src/control/Gen/api.ts +276 -0
- package/_src/control/Gen/constraints.ts +38 -0
- package/_src/control/Gen/definition.ts +9 -0
- package/_src/control/Gen.ts +15 -0
- package/_src/control/Live/definition.ts +47 -0
- package/_src/control/Live.ts +3 -0
- package/_src/control/RunnableSpec.ts +42 -0
- package/_src/control/Sample/api.ts +287 -0
- package/_src/control/Sample/definition.ts +7 -0
- package/_src/control/Sample.ts +4 -0
- package/_src/control/Sized/api.ts +14 -0
- package/_src/control/Sized/definition.ts +13 -0
- package/_src/control/Sized/live.ts +19 -0
- package/_src/control/Sized.ts +5 -0
- package/_src/control/Spec/api.ts +384 -0
- package/_src/control/Spec/definition.ts +103 -0
- package/_src/control/Spec.ts +4 -0
- package/_src/control/SummaryBuilder.ts +68 -0
- package/_src/control/Test.ts +31 -0
- package/_src/control/TestAnnotationRenderer/api.ts +75 -0
- package/_src/control/TestAnnotationRenderer/definition.ts +49 -0
- package/_src/control/TestAnnotationRenderer.ts +4 -0
- package/_src/control/TestAspect/api.ts +122 -0
- package/_src/control/TestAspect/definition.ts +3 -0
- package/_src/control/TestAspect.ts +4 -0
- package/_src/control/TestClock/api.ts +36 -0
- package/_src/control/TestClock/definition.ts +196 -0
- package/_src/control/TestClock.ts +4 -0
- package/_src/control/TestConsole/api.ts +36 -0
- package/_src/control/TestConsole/definition.ts +61 -0
- package/_src/control/TestConsole.ts +4 -0
- package/_src/control/TestEnvironment.ts +30 -0
- package/_src/control/TestExecutor.ts +54 -0
- package/_src/control/TestLogger.ts +37 -0
- package/_src/control/TestRandom/api.ts +76 -0
- package/_src/control/TestRandom/definition.ts +362 -0
- package/_src/control/TestRandom.ts +4 -0
- package/_src/control/TestRenderer/ConsoleRenderer.ts +94 -0
- package/_src/control/TestRenderer/definition.ts +7 -0
- package/_src/control/TestRunner.ts +34 -0
- package/_src/data/AssertionData.ts +33 -0
- package/_src/data/AssertionResult.ts +31 -0
- package/_src/data/AssertionValue/api.ts +48 -0
- package/_src/data/AssertionValue/definition.ts +20 -0
- package/_src/data/AssertionValue.ts +4 -0
- package/_src/data/ExecutedSpec/api.ts +96 -0
- package/_src/data/ExecutedSpec/definition.ts +37 -0
- package/_src/data/ExecutedSpec.ts +4 -0
- package/_src/data/ExecutionResult.ts +153 -0
- package/_src/data/FailureDetails.ts +13 -0
- package/_src/data/FreeBooleanAlgebra/api.ts +152 -0
- package/_src/data/FreeBooleanAlgebra/definition.ts +38 -0
- package/_src/data/FreeBooleanAlgebra.ts +4 -0
- package/_src/data/GenFailureDetails.ts +3 -0
- package/_src/data/LogLine/Fragment.ts +59 -0
- package/_src/data/LogLine/Line.ts +91 -0
- package/_src/data/LogLine/Message.ts +94 -0
- package/_src/data/LogLine/Style.ts +150 -0
- package/_src/data/LogLine/api.ts +40 -0
- package/_src/data/LogLine.ts +2 -0
- package/_src/data/Render/api.ts +18 -0
- package/_src/data/Render/definition.ts +36 -0
- package/_src/data/Render.ts +4 -0
- package/_src/data/RenderParam/api.ts +31 -0
- package/_src/data/RenderParam/definition.ts +28 -0
- package/_src/data/RenderParam.ts +4 -0
- package/_src/data/Summary.ts +4 -0
- package/_src/data/TestAnnotation/api.ts +49 -0
- package/_src/data/TestAnnotation/definition.ts +37 -0
- package/_src/data/TestAnnotation.ts +4 -0
- package/_src/data/TestAnnotationMap.ts +41 -0
- package/_src/data/TestArgs/definition.ts +7 -0
- package/_src/data/TestArgs.ts +3 -0
- package/_src/data/TestConfig.ts +47 -0
- package/_src/data/TestFailure.ts +56 -0
- package/_src/data/TestSuccess.ts +39 -0
- package/_src/data/TestTimeoutException.ts +5 -0
- package/_src/demo.ts +16 -0
- package/_src/util/math.ts +497 -0
- package/api.d.ts +21 -0
- package/control/AbstractRunnableSpec.d.ts +15 -0
- package/control/Annotations/api.d.ts +26 -0
- package/control/Annotations/definition.d.ts +20 -0
- package/control/Annotations/live.d.ts +18 -0
- package/control/Annotations.d.ts +3 -0
- package/control/Assertion/api.d.ts +81 -0
- package/control/Assertion/definition.d.ts +17 -0
- package/control/Assertion.d.ts +2 -0
- package/control/AssertionIO/api.d.ts +18 -0
- package/control/AssertionIO/definition.d.ts +18 -0
- package/control/AssertionIO.d.ts +2 -0
- package/control/DefaultRunnableSpec.d.ts +7 -0
- package/control/DefaultTestReporter/definition.d.ts +6 -0
- package/control/DefaultTestReporter/render.d.ts +23 -0
- package/control/DefaultTestReporter.d.ts +2 -0
- package/control/FreeBooleanAlgebraIO/api.d.ts +44 -0
- package/control/FreeBooleanAlgebraIO/definition.d.ts +12 -0
- package/control/FreeBooleanAlgebraIO.d.ts +2 -0
- package/control/Gen/api/array.d.ts +19 -0
- package/control/Gen/api/char.d.ts +47 -0
- package/control/Gen/api/conc.d.ts +26 -0
- package/control/Gen/api/double.d.ts +13 -0
- package/control/Gen/api/float.d.ts +7 -0
- package/control/Gen/api/string.d.ts +49 -0
- package/control/Gen/api/struct.d.ts +8 -0
- package/control/Gen/api.d.ts +169 -0
- package/control/Gen/constraints.d.ts +32 -0
- package/control/Gen/definition.d.ts +11 -0
- package/control/Gen.d.ts +10 -0
- package/control/Live/definition.d.ts +24 -0
- package/control/Live.d.ts +1 -0
- package/control/RunnableSpec.d.ts +12 -0
- package/control/Sample/api.d.ts +79 -0
- package/control/Sample/definition.d.ts +11 -0
- package/control/Sample.d.ts +2 -0
- package/control/Sized/api.d.ts +13 -0
- package/control/Sized/definition.d.ts +14 -0
- package/control/Sized/live.d.ts +9 -0
- package/control/Sized.d.ts +3 -0
- package/control/Spec/api.d.ts +159 -0
- package/control/Spec/definition.d.ts +96 -0
- package/control/Spec.d.ts +2 -0
- package/control/SummaryBuilder.d.ts +15 -0
- package/control/Test.d.ts +20 -0
- package/control/TestAnnotationRenderer/api.d.ts +42 -0
- package/control/TestAnnotationRenderer/definition.d.ts +31 -0
- package/control/TestAnnotationRenderer.d.ts +2 -0
- package/control/TestAspect/api.d.ts +23 -0
- package/control/TestAspect/definition.d.ts +2 -0
- package/control/TestAspect.d.ts +2 -0
- package/control/TestClock/api.d.ts +21 -0
- package/control/TestClock/definition.d.ts +66 -0
- package/control/TestClock.d.ts +2 -0
- package/control/TestConsole/api.d.ts +15 -0
- package/control/TestConsole/definition.d.ts +39 -0
- package/control/TestConsole.d.ts +2 -0
- package/control/TestEnvironment.d.ts +16 -0
- package/control/TestExecutor.d.ts +13 -0
- package/control/TestLogger.d.ts +25 -0
- package/control/TestRandom/api.d.ts +49 -0
- package/control/TestRandom/definition.d.ts +91 -0
- package/control/TestRandom.d.ts +2 -0
- package/control/TestRenderer/ConsoleRenderer.d.ts +15 -0
- package/control/TestRenderer/definition.d.ts +4 -0
- package/control/TestRunner.d.ts +18 -0
- package/data/AssertionData.d.ts +24 -0
- package/data/AssertionResult.d.ts +23 -0
- package/data/AssertionValue/api.d.ts +27 -0
- package/data/AssertionValue/definition.d.ts +19 -0
- package/data/AssertionValue.d.ts +2 -0
- package/data/ExecutedSpec/api.d.ts +47 -0
- package/data/ExecutedSpec/definition.d.ts +39 -0
- package/data/ExecutedSpec.d.ts +2 -0
- package/data/ExecutionResult.d.ts +59 -0
- package/data/FailureDetails.d.ts +15 -0
- package/data/FreeBooleanAlgebra/api.d.ts +81 -0
- package/data/FreeBooleanAlgebra/definition.d.ts +38 -0
- package/data/FreeBooleanAlgebra.d.ts +2 -0
- package/data/GenFailureDetails.d.ts +6 -0
- package/data/LogLine/Fragment.d.ts +46 -0
- package/data/LogLine/Line.d.ts +62 -0
- package/data/LogLine/Message.d.ts +61 -0
- package/data/LogLine/Style.d.ts +107 -0
- package/data/LogLine/api.d.ts +11 -0
- package/data/LogLine.d.ts +2 -0
- package/data/Render/api.d.ts +13 -0
- package/data/Render/definition.d.ts +31 -0
- package/data/Render.d.ts +2 -0
- package/data/RenderParam/api.d.ts +13 -0
- package/data/RenderParam/definition.d.ts +25 -0
- package/data/RenderParam.d.ts +2 -0
- package/data/Summary.d.ts +8 -0
- package/data/TestAnnotation/api.d.ts +41 -0
- package/data/TestAnnotation/definition.d.ts +20 -0
- package/data/TestAnnotation.d.ts +2 -0
- package/data/TestAnnotationMap.d.ts +12 -0
- package/data/TestArgs/definition.d.ts +7 -0
- package/data/TestArgs.d.ts +1 -0
- package/data/TestConfig.d.ts +42 -0
- package/data/TestFailure.d.ts +46 -0
- package/data/TestSuccess.d.ts +33 -0
- package/data/TestTimeoutException.d.ts +3 -0
- package/demo.d.ts +1 -0
- package/package.json +18 -0
- package/util/math.d.ts +130 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
/**
|
2
|
+
* @tsplus type fncts.test.data.TestConfig
|
3
|
+
* @tsplus companion fncts.test.data.TestConfigOps
|
4
|
+
*/
|
5
|
+
export abstract class TestConfig {
|
6
|
+
abstract readonly repeats: number;
|
7
|
+
abstract readonly retries: number;
|
8
|
+
abstract readonly samples: number;
|
9
|
+
abstract readonly shrinks: number;
|
10
|
+
}
|
11
|
+
|
12
|
+
/**
|
13
|
+
* @tsplus static fncts.test.data.TestConfigOps Tag
|
14
|
+
*/
|
15
|
+
export const TestConfigTag = Tag<TestConfig>();
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @tsplus static fncts.test.data.TestConfigOps Live
|
19
|
+
*/
|
20
|
+
export function live(_: TestConfig): Layer<unknown, never, Has<TestConfig>> {
|
21
|
+
return Layer.succeed(
|
22
|
+
new (class extends TestConfig {
|
23
|
+
repeats = _.repeats;
|
24
|
+
retries = _.retries;
|
25
|
+
samples = _.samples;
|
26
|
+
shrinks = _.shrinks;
|
27
|
+
})(),
|
28
|
+
TestConfig.Tag,
|
29
|
+
);
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @tsplus static fncts.test.data.TestConfigOps repeats
|
34
|
+
*/
|
35
|
+
export const repeats = IO.serviceWith((_: TestConfig) => _.repeats, TestConfig.Tag);
|
36
|
+
/**
|
37
|
+
* @tsplus static fncts.test.data.TestConfigOps retries
|
38
|
+
*/
|
39
|
+
export const retries = IO.serviceWith((_: TestConfig) => _.retries, TestConfig.Tag);
|
40
|
+
/**
|
41
|
+
* @tsplus static fncts.test.data.TestConfigOps samples
|
42
|
+
*/
|
43
|
+
export const samples = IO.serviceWith((_: TestConfig) => _.samples, TestConfig.Tag);
|
44
|
+
/**
|
45
|
+
* @tsplus static fncts.test.data.TestConfigOps shrinks
|
46
|
+
*/
|
47
|
+
export const shrinks = IO.serviceWith((_: TestConfig) => _.shrinks, TestConfig.Tag);
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import type { TestResult } from "./FailureDetails.js";
|
2
|
+
|
3
|
+
export const enum TestFailureTag {
|
4
|
+
AssertionFailure = "AssertionFailure",
|
5
|
+
RuntimeFailure = "RuntimeFailure",
|
6
|
+
}
|
7
|
+
|
8
|
+
export class AssertionFailure {
|
9
|
+
readonly _tag = TestFailureTag.AssertionFailure;
|
10
|
+
constructor(readonly result: TestResult) {}
|
11
|
+
}
|
12
|
+
|
13
|
+
export class RuntimeFailure<E> {
|
14
|
+
readonly _tag = TestFailureTag.RuntimeFailure;
|
15
|
+
constructor(readonly cause: Cause<E>) {}
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* @tsplus type fncts.test.data.TestFailure
|
20
|
+
*/
|
21
|
+
export type TestFailure<E> = AssertionFailure | RuntimeFailure<E>;
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @tsplus type fncts.test.data.TestFailureOps
|
25
|
+
*/
|
26
|
+
export interface TestFailureOps {}
|
27
|
+
|
28
|
+
export const TestFailure: TestFailureOps = {};
|
29
|
+
|
30
|
+
/**
|
31
|
+
* @tsplus static fncts.test.data.TestFailureOps assertion
|
32
|
+
*/
|
33
|
+
export function assertion(result: TestResult): TestFailure<never> {
|
34
|
+
return new AssertionFailure(result);
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @tsplus static fncts.test.data.TestFailureOps halt
|
39
|
+
*/
|
40
|
+
export function halt(defect: unknown): TestFailure<never> {
|
41
|
+
return new RuntimeFailure(Cause.halt(defect));
|
42
|
+
}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* @tsplus static fncts.test.data.TestFailureOps fail
|
46
|
+
*/
|
47
|
+
export function fail<E>(e: E): TestFailure<E> {
|
48
|
+
return new RuntimeFailure(Cause.fail(e));
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* @tsplus static fncts.test.data.TestFailureOps failCause
|
53
|
+
*/
|
54
|
+
export function failCause<E>(cause: Cause<E>): TestFailure<E> {
|
55
|
+
return new RuntimeFailure(cause);
|
56
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import type { FreeBooleanAlgebra } from "./FreeBooleanAlgebra.js";
|
2
|
+
|
3
|
+
export const enum TestSuccessTag {
|
4
|
+
Succeeded = "Succeeded",
|
5
|
+
Ignored = "Ignored",
|
6
|
+
}
|
7
|
+
|
8
|
+
export class Succeeded {
|
9
|
+
readonly _tag = TestSuccessTag.Succeeded;
|
10
|
+
constructor(readonly result: FreeBooleanAlgebra<void>) {}
|
11
|
+
}
|
12
|
+
|
13
|
+
export class Ignored {
|
14
|
+
readonly _tag = TestSuccessTag.Ignored;
|
15
|
+
}
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @tsplus type fncts.test.TestSuccess
|
19
|
+
*/
|
20
|
+
export type TestSuccess = Succeeded | Ignored;
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @tsplus type fncts.test.TestSuccessOps
|
24
|
+
*/
|
25
|
+
export interface TestSuccessOps {}
|
26
|
+
|
27
|
+
export const TestSuccess: TestSuccessOps = {};
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @tsplus static fncts.test.TestSuccessOps Succeeded
|
31
|
+
*/
|
32
|
+
export function succeeded(result: FreeBooleanAlgebra<void>): TestSuccess {
|
33
|
+
return new Succeeded(result);
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @tsplus static fncts.test.TestSuccessOps Ignored
|
38
|
+
*/
|
39
|
+
export const ignored = new Ignored();
|
package/_src/demo.ts
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
import { DefaultRunnableSpec } from "@fncts/test/control/DefaultRunnableSpec";
|
2
|
+
|
3
|
+
import { suite, test, testIO } from "./api.js";
|
4
|
+
import { strictEqualTo } from "./control/Assertion.js";
|
5
|
+
|
6
|
+
const ServiceATag = Tag<{ x: number }>();
|
7
|
+
|
8
|
+
class DemoSpec extends DefaultRunnableSpec {
|
9
|
+
spec = suite(
|
10
|
+
"TestSuite",
|
11
|
+
test("Demo success", (0).assert(strictEqualTo(0))),
|
12
|
+
test("Demo failure", { a: { b: { c: { d: 100 } } } }.assert(strictEqualTo({ a: { b: { c: { d: 0 } } } }))),
|
13
|
+
);
|
14
|
+
}
|
15
|
+
|
16
|
+
new DemoSpec().main();
|
@@ -0,0 +1,497 @@
|
|
1
|
+
/** @internal */
|
2
|
+
export const MIN_VALUE_32 = 2 ** -126 * 2 ** -23;
|
3
|
+
/** @internal */
|
4
|
+
export const MAX_VALUE_32 = 2 ** 127 * (1 + (2 ** 23 - 1) / 2 ** 23);
|
5
|
+
/** @internal */
|
6
|
+
export const EPSILON_32 = 2 ** -23;
|
7
|
+
|
8
|
+
/** @internal */
|
9
|
+
const INDEX_POSITIVE_INFINITY_32 = 2139095040; // floatToIndex(MAX_VALUE_32) + 1;
|
10
|
+
/** @internal */
|
11
|
+
const INDEX_NEGATIVE_INFINITY_32 = -2139095041; // floatToIndex(-MAX_VALUE_32) - 1
|
12
|
+
|
13
|
+
export function safeFloatToIndex(f: number, label: string): IO<unknown, never, number> {
|
14
|
+
const conversionTrick = "you can convert any double to a 32-bit float by using `new Float32Array([myDouble])[0]`";
|
15
|
+
const errorMessage = "fc.floatNext constraints." + label + " must be a 32-bit float - " + conversionTrick;
|
16
|
+
if (Number.isNaN(f) || (Number.isFinite(f) && (f < -MAX_VALUE_32 || f > MAX_VALUE_32))) {
|
17
|
+
return IO.haltNow(new Error(errorMessage));
|
18
|
+
}
|
19
|
+
const index = floatToIndex(f);
|
20
|
+
if (!Number.isInteger(index)) {
|
21
|
+
return IO.haltNow(new Error(errorMessage));
|
22
|
+
}
|
23
|
+
return IO.succeedNow(index);
|
24
|
+
}
|
25
|
+
|
26
|
+
export function decomposeFloat(f: number): { exponent: number; significand: number } {
|
27
|
+
// 1 => significand 0b1 - exponent 1 (will be preferred)
|
28
|
+
// => significand 0b0.1 - exponent 2
|
29
|
+
const maxSignificand = 1 + (2 ** 23 - 1) / 2 ** 23;
|
30
|
+
for (let exponent = -126; exponent !== 128; ++exponent) {
|
31
|
+
const powExponent = 2 ** exponent;
|
32
|
+
const maxForExponent = maxSignificand * powExponent;
|
33
|
+
if (Math.abs(f) <= maxForExponent) {
|
34
|
+
return { exponent, significand: f / powExponent };
|
35
|
+
}
|
36
|
+
}
|
37
|
+
return { exponent: Number.NaN, significand: Number.NaN };
|
38
|
+
}
|
39
|
+
|
40
|
+
export function floatToIndex(f: number): number {
|
41
|
+
if (f === Number.POSITIVE_INFINITY) {
|
42
|
+
return INDEX_POSITIVE_INFINITY_32;
|
43
|
+
}
|
44
|
+
if (f === Number.NEGATIVE_INFINITY) {
|
45
|
+
return INDEX_NEGATIVE_INFINITY_32;
|
46
|
+
}
|
47
|
+
const { exponent, significand } = decomposeFloat(f);
|
48
|
+
|
49
|
+
if (Number.isNaN(exponent) || Number.isNaN(significand) || !Number.isInteger(significand * 0x800000)) {
|
50
|
+
return Number.NaN;
|
51
|
+
}
|
52
|
+
|
53
|
+
if (f > 0 || (f === 0 && 1 / f === Number.POSITIVE_INFINITY)) {
|
54
|
+
return indexInFloatFromDecomp(exponent, significand);
|
55
|
+
} else {
|
56
|
+
return -indexInFloatFromDecomp(exponent, -significand) - 1;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
/** @internal */
|
61
|
+
export function indexInFloatFromDecomp(exponent: number, significand: number) {
|
62
|
+
// WARNING: significand >= 0
|
63
|
+
|
64
|
+
// By construct of significand in decomposeFloat,
|
65
|
+
// significand is always max-ed.
|
66
|
+
|
67
|
+
// The float close to zero are the only one having a significand <1, they also have an exponent of -126.
|
68
|
+
// They are in range: [2**(-126) * 2**(-23), 2**(-126) * (2 - 2 ** 23)]
|
69
|
+
// In other words there are 2**24 elements in that range if we include zero.
|
70
|
+
// All other ranges (other exponents) have a length of 2**23 elements.
|
71
|
+
if (exponent === -126) {
|
72
|
+
return significand * 0x800000; // significand * 2**23
|
73
|
+
}
|
74
|
+
// Offset due to exp = -126 + Offset of previous exp (excl. -126) + Offset in current exp
|
75
|
+
// 2**24 + (exponent - (-126) -1) * 2**23 + (significand - 1) * 2**23
|
76
|
+
return (exponent + 127) * 0x800000 + (significand - 1) * 0x800000;
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Compute the 32-bit floating point number corresponding to the provided indexes
|
81
|
+
*
|
82
|
+
* @param n - index of the float
|
83
|
+
*
|
84
|
+
* @internal
|
85
|
+
*/
|
86
|
+
export function indexToFloat(index: number): number {
|
87
|
+
if (index < 0) {
|
88
|
+
return -indexToFloat(-index - 1);
|
89
|
+
}
|
90
|
+
if (index === INDEX_POSITIVE_INFINITY_32) {
|
91
|
+
return Number.POSITIVE_INFINITY;
|
92
|
+
}
|
93
|
+
if (index < 0x1000000) {
|
94
|
+
// The first 2**24 elements correspond to values having
|
95
|
+
// exponent = -126 and significand = index * 2**(-23)
|
96
|
+
return index * 2 ** -149;
|
97
|
+
}
|
98
|
+
const postIndex = index - 0x1000000;
|
99
|
+
// Math.floor(postIndex / 0x800000) = Math.floor(postIndex / 2**23) = (postIndex >> 23)
|
100
|
+
const exponent = -125 + (postIndex >> 23);
|
101
|
+
// (postIndex % 0x800000) / 0x800000 = (postIndex & 0x7fffff) / 0x800000
|
102
|
+
const significand = 1 + (postIndex & 0x7fffff) / 0x800000;
|
103
|
+
return significand * 2 ** exponent;
|
104
|
+
}
|
105
|
+
|
106
|
+
/** @internal */
|
107
|
+
export type ArrayInt64 = { sign: 1 | -1; data: [number, number] };
|
108
|
+
|
109
|
+
/** @internal */
|
110
|
+
export const Zero64: ArrayInt64 = { sign: 1, data: [0, 0] };
|
111
|
+
|
112
|
+
/** @internal */
|
113
|
+
export const Unit64: ArrayInt64 = { sign: 1, data: [0, 1] };
|
114
|
+
|
115
|
+
/** @internal */
|
116
|
+
export function isZero64(a: ArrayInt64): boolean {
|
117
|
+
return a.data[0] === 0 && a.data[1] === 0;
|
118
|
+
}
|
119
|
+
|
120
|
+
/** @internal */
|
121
|
+
export function isStrictlyNegative64(a: ArrayInt64): boolean {
|
122
|
+
return a.sign === -1 && !isZero64(a);
|
123
|
+
}
|
124
|
+
|
125
|
+
/** @internal */
|
126
|
+
export function isStrictlyPositive64(a: ArrayInt64): boolean {
|
127
|
+
return a.sign === 1 && !isZero64(a);
|
128
|
+
}
|
129
|
+
|
130
|
+
/** @internal */
|
131
|
+
export function isEqual64(a: ArrayInt64, b: ArrayInt64): boolean {
|
132
|
+
if (a.data[0] === b.data[0] && a.data[1] === b.data[1]) {
|
133
|
+
return a.sign === b.sign || (a.data[0] === 0 && a.data[1] === 0); // either the same or both zero
|
134
|
+
}
|
135
|
+
return false;
|
136
|
+
}
|
137
|
+
|
138
|
+
/** @internal */
|
139
|
+
function isStrictlySmaller64Internal(a: ArrayInt64["data"], b: ArrayInt64["data"]): boolean {
|
140
|
+
return a[0] < b[0] || (a[0] === b[0] && a[1] < b[1]);
|
141
|
+
}
|
142
|
+
|
143
|
+
/** @internal */
|
144
|
+
export function isStrictlySmaller64(a: ArrayInt64, b: ArrayInt64): boolean {
|
145
|
+
if (a.sign === b.sign) {
|
146
|
+
return a.sign === 1
|
147
|
+
? isStrictlySmaller64Internal(a.data, b.data) // a.sign = +1, b.sign = +1
|
148
|
+
: isStrictlySmaller64Internal(b.data, a.data); // a.sign = -1, b.sign = -1
|
149
|
+
}
|
150
|
+
// a.sign = +1, b.sign = -1 is always false
|
151
|
+
return a.sign === -1 && (!isZero64(a) || !isZero64(b)); // a.sign = -1, b.sign = +1
|
152
|
+
}
|
153
|
+
|
154
|
+
/** @internal */
|
155
|
+
export function clone64(a: ArrayInt64): ArrayInt64 {
|
156
|
+
return { sign: a.sign, data: [a.data[0], a.data[1]] };
|
157
|
+
}
|
158
|
+
|
159
|
+
/** @internal */
|
160
|
+
function substract64DataInternal(a: ArrayInt64["data"], b: ArrayInt64["data"]): ArrayInt64["data"] {
|
161
|
+
let reminderLow = 0;
|
162
|
+
let low = a[1] - b[1];
|
163
|
+
if (low < 0) {
|
164
|
+
reminderLow = 1;
|
165
|
+
low = low >>> 0;
|
166
|
+
}
|
167
|
+
return [a[0] - b[0] - reminderLow, low];
|
168
|
+
}
|
169
|
+
|
170
|
+
/**
|
171
|
+
* Expects a >= b
|
172
|
+
* @internal
|
173
|
+
*/
|
174
|
+
function substract64Internal(a: ArrayInt64, b: ArrayInt64): ArrayInt64 {
|
175
|
+
if (a.sign === 1 && b.sign === -1) {
|
176
|
+
// Operation is a simple sum of a + abs(b)
|
177
|
+
const low = a.data[1] + b.data[1];
|
178
|
+
const high = a.data[0] + b.data[0] + (low > 0xffffffff ? 1 : 0);
|
179
|
+
return { sign: 1, data: [high >>> 0, low >>> 0] };
|
180
|
+
}
|
181
|
+
|
182
|
+
// a.sign === -1 with b.sign === 1 is impossible given: a - b >= 0, except for a = 0 and b = 0
|
183
|
+
// Operation is a substraction
|
184
|
+
return {
|
185
|
+
sign: 1,
|
186
|
+
data: a.sign === 1 ? substract64DataInternal(a.data, b.data) : substract64DataInternal(b.data, a.data),
|
187
|
+
};
|
188
|
+
}
|
189
|
+
|
190
|
+
/**
|
191
|
+
* Substract two ArrayInt64
|
192
|
+
* @returns When result is zero always with sign=1
|
193
|
+
* @internal
|
194
|
+
*/
|
195
|
+
export function substract64(arrayIntA: ArrayInt64, arrayIntB: ArrayInt64): ArrayInt64 {
|
196
|
+
if (isStrictlySmaller64(arrayIntA, arrayIntB)) {
|
197
|
+
const out = substract64Internal(arrayIntB, arrayIntA);
|
198
|
+
out.sign = -1;
|
199
|
+
return out;
|
200
|
+
}
|
201
|
+
return substract64Internal(arrayIntA, arrayIntB);
|
202
|
+
}
|
203
|
+
|
204
|
+
/**
|
205
|
+
* Negative version of an ArrayInt64
|
206
|
+
* @internal
|
207
|
+
*/
|
208
|
+
export function negative64(arrayIntA: ArrayInt64): ArrayInt64 {
|
209
|
+
return {
|
210
|
+
sign: -arrayIntA.sign as -1 | 1,
|
211
|
+
data: [arrayIntA.data[0], arrayIntA.data[1]],
|
212
|
+
};
|
213
|
+
}
|
214
|
+
|
215
|
+
/**
|
216
|
+
* Add two ArrayInt64
|
217
|
+
* @returns When result is zero always with sign=1
|
218
|
+
* @internal
|
219
|
+
*/
|
220
|
+
export function add64(arrayIntA: ArrayInt64, arrayIntB: ArrayInt64): ArrayInt64 {
|
221
|
+
if (isZero64(arrayIntB)) {
|
222
|
+
if (isZero64(arrayIntA)) {
|
223
|
+
return clone64(Zero64);
|
224
|
+
}
|
225
|
+
return clone64(arrayIntA);
|
226
|
+
}
|
227
|
+
return substract64(arrayIntA, negative64(arrayIntB));
|
228
|
+
}
|
229
|
+
|
230
|
+
/**
|
231
|
+
* Halve an ArrayInt64
|
232
|
+
* @internal
|
233
|
+
*/
|
234
|
+
export function halve64(a: ArrayInt64): ArrayInt64 {
|
235
|
+
return {
|
236
|
+
sign: a.sign,
|
237
|
+
data: [Math.floor(a.data[0] / 2), (a.data[0] % 2 === 1 ? 0x80000000 : 0) + Math.floor(a.data[1] / 2)],
|
238
|
+
};
|
239
|
+
}
|
240
|
+
|
241
|
+
/**
|
242
|
+
* Apply log2 to an ArrayInt64 (preserve sign)
|
243
|
+
* @internal
|
244
|
+
*/
|
245
|
+
export function logLike64(a: ArrayInt64): ArrayInt64 {
|
246
|
+
// Math.floor(Math.log(hi * 2**32 + low) / Math.log(2)) <= Math.floor(Math.log(2**64) / Math.log(2)) = 64
|
247
|
+
return {
|
248
|
+
sign: a.sign,
|
249
|
+
data: [0, Math.floor(Math.log(a.data[0] * 0x100000000 + a.data[1]) / Math.log(2))],
|
250
|
+
};
|
251
|
+
}
|
252
|
+
|
253
|
+
/** @internal */
|
254
|
+
const INDEX_POSITIVE_INFINITY: ArrayInt64 = { sign: 1, data: [2146435072, 0] }; // doubleToIndex(Number.MAX_VALUE) + 1;
|
255
|
+
/** @internal */
|
256
|
+
const INDEX_NEGATIVE_INFINITY: ArrayInt64 = { sign: -1, data: [2146435072, 1] }; // doubleToIndex(-Number.MAX_VALUE) - 1
|
257
|
+
|
258
|
+
/**
|
259
|
+
* Decompose a 64-bit floating point number into a significand and exponent
|
260
|
+
* such that:
|
261
|
+
* - significand over 53 bits including sign (also referred as fraction)
|
262
|
+
* - exponent over 11 bits including sign
|
263
|
+
* - whenever there are multiple possibilities we take the one having the highest significand (in abs)
|
264
|
+
* - Number.MAX_VALUE = 2**1023 * (1 + (2**52-1)/2**52)
|
265
|
+
* = 2**1023 * (2 - Number.EPSILON)
|
266
|
+
* - Number.MIN_VALUE = 2**(-1022) * 2**(-52)
|
267
|
+
* - Number.EPSILON = 2**(-52)
|
268
|
+
*
|
269
|
+
* @param d - 64-bit floating point number to be decomposed into (significand, exponent)
|
270
|
+
*
|
271
|
+
* @internal
|
272
|
+
*/
|
273
|
+
export function decomposeDouble(d: number): { exponent: number; significand: number } {
|
274
|
+
// 1 => significand 0b1 - exponent 1 (will be preferred)
|
275
|
+
// => significand 0b0.1 - exponent 2
|
276
|
+
const maxSignificand = 2 - Number.EPSILON;
|
277
|
+
for (let exponent = -1022; exponent !== 1024; ++exponent) {
|
278
|
+
const powExponent = 2 ** exponent;
|
279
|
+
const maxForExponent = maxSignificand * powExponent;
|
280
|
+
if (Math.abs(d) <= maxForExponent) {
|
281
|
+
return { exponent, significand: d / powExponent };
|
282
|
+
}
|
283
|
+
}
|
284
|
+
return { exponent: Number.NaN, significand: Number.NaN };
|
285
|
+
}
|
286
|
+
|
287
|
+
/** @internal */
|
288
|
+
function positiveNumberToInt64(n: number): ArrayInt64["data"] {
|
289
|
+
return [~~(n / 0x100000000), n >>> 0];
|
290
|
+
}
|
291
|
+
|
292
|
+
/** @internal */
|
293
|
+
function indexInDoubleFromDecomp(exponent: number, significand: number): ArrayInt64["data"] {
|
294
|
+
// WARNING: significand >= 0
|
295
|
+
|
296
|
+
// By construct of significand in decomposeDouble,
|
297
|
+
// significand is always max-ed.
|
298
|
+
|
299
|
+
// The double close to zero are the only one having a significand <1, they also have an exponent of -1022.
|
300
|
+
// They are in range: [2**(-1022) * 2**(-52), 2**(-1022) * (2 - 2 ** 52)]
|
301
|
+
// In other words there are 2**53 elements in that range if we include zero.
|
302
|
+
// All other ranges (other exponents) have a length of 2**52 elements.
|
303
|
+
if (exponent === -1022) {
|
304
|
+
// We want the significand to be an integer value (like an index)
|
305
|
+
const rescaledSignificand = significand * 2 ** 52; // significand * 2**52
|
306
|
+
return positiveNumberToInt64(rescaledSignificand);
|
307
|
+
}
|
308
|
+
// Offset due to exp = -1022 + Offset of previous exp (excl. -1022) + Offset in current exp
|
309
|
+
// 2**53 + (exponent - (-1022) -1) * 2**52 + (significand - 1) * 2**52
|
310
|
+
// (exponent + 1023) * 2**52 + (significand - 1) * 2**52
|
311
|
+
const rescaledSignificand = (significand - 1) * 2 ** 52; // (significand-1) * 2**52
|
312
|
+
const exponentOnlyHigh = (exponent + 1023) * 2 ** 20; // (exponent + 1023) * 2**52 => [high: (exponent + 1023) * 2**20, low: 0]
|
313
|
+
const index = positiveNumberToInt64(rescaledSignificand);
|
314
|
+
index[0] += exponentOnlyHigh;
|
315
|
+
return index;
|
316
|
+
}
|
317
|
+
|
318
|
+
/**
|
319
|
+
* Compute the index of d relative to other available 64-bit floating point numbers
|
320
|
+
* Rq: Produces negative indexes for negative doubles
|
321
|
+
*
|
322
|
+
* @param d - 64-bit floating point number, anything except NaN
|
323
|
+
*
|
324
|
+
* @internal
|
325
|
+
*/
|
326
|
+
export function doubleToIndex(d: number): ArrayInt64 {
|
327
|
+
if (d === Number.POSITIVE_INFINITY) {
|
328
|
+
return clone64(INDEX_POSITIVE_INFINITY);
|
329
|
+
}
|
330
|
+
if (d === Number.NEGATIVE_INFINITY) {
|
331
|
+
return clone64(INDEX_NEGATIVE_INFINITY);
|
332
|
+
}
|
333
|
+
const decomp = decomposeDouble(d);
|
334
|
+
const exponent = decomp.exponent;
|
335
|
+
const significand = decomp.significand;
|
336
|
+
if (d > 0 || (d === 0 && 1 / d === Number.POSITIVE_INFINITY)) {
|
337
|
+
return { sign: 1, data: indexInDoubleFromDecomp(exponent, significand) };
|
338
|
+
} else {
|
339
|
+
const indexOpposite = indexInDoubleFromDecomp(exponent, -significand);
|
340
|
+
if (indexOpposite[1] === 0xffffffff) {
|
341
|
+
indexOpposite[0] += 1;
|
342
|
+
indexOpposite[1] = 0;
|
343
|
+
} else {
|
344
|
+
indexOpposite[1] += 1;
|
345
|
+
}
|
346
|
+
return { sign: -1, data: indexOpposite }; // -indexInDoubleFromDecomp(exponent, -significand) - 1
|
347
|
+
}
|
348
|
+
}
|
349
|
+
|
350
|
+
/**
|
351
|
+
* Compute the 64-bit floating point number corresponding to the provided indexes
|
352
|
+
*
|
353
|
+
* @param n - index of the double
|
354
|
+
*
|
355
|
+
* @internal
|
356
|
+
*/
|
357
|
+
export function indexToDouble(index: ArrayInt64): number {
|
358
|
+
if (index.sign === -1) {
|
359
|
+
const indexOpposite: ArrayInt64 = { sign: 1, data: [index.data[0], index.data[1]] };
|
360
|
+
if (indexOpposite.data[1] === 0) {
|
361
|
+
indexOpposite.data[0] -= 1;
|
362
|
+
indexOpposite.data[1] = 0xffffffff;
|
363
|
+
} else {
|
364
|
+
indexOpposite.data[1] -= 1;
|
365
|
+
}
|
366
|
+
return -indexToDouble(indexOpposite); // -indexToDouble(-index - 1);
|
367
|
+
}
|
368
|
+
if (isEqual64(index, INDEX_POSITIVE_INFINITY)) {
|
369
|
+
return Number.POSITIVE_INFINITY;
|
370
|
+
}
|
371
|
+
if (index.data[0] < 0x200000) {
|
372
|
+
// if: index < 2 ** 53 <--> index[0] < 2 ** (53-32) = 0x20_0000
|
373
|
+
// The first 2**53 elements correspond to values having
|
374
|
+
// exponent = -1022 and significand = index * Number.EPSILON
|
375
|
+
// double value = index * 2 ** -1022 * Number.EPSILON
|
376
|
+
// = index * 2 ** -1022 * 2 ** -52
|
377
|
+
// = index * 2 ** -1074
|
378
|
+
return (index.data[0] * 0x100000000 + index.data[1]) * 2 ** -1074;
|
379
|
+
}
|
380
|
+
const postIndexHigh = index.data[0] - 0x200000; // postIndex = index - 2 ** 53
|
381
|
+
// exponent = -1021 + Math.floor(postIndex / 2**52)
|
382
|
+
// = -1021 + Math.floor(postIndexHigh / 2**(52-32))
|
383
|
+
// = -1021 + Math.floor(postIndexHigh / 2**20)
|
384
|
+
// = -1021 + (postIndexHigh >> 20)
|
385
|
+
const exponent = -1021 + (postIndexHigh >> 20);
|
386
|
+
// significand = 1 + (postIndex % 2**52) / 2**52
|
387
|
+
// = 1 + ((postIndexHigh * 2**32 + postIndexLow) % 2**52) / 2**52
|
388
|
+
// = 1 + ((postIndexHigh % 2**20) * 2**32 + postIndexLow) / 2**52
|
389
|
+
// = 1 + ((postIndexHigh & 0xfffff) * 2**32 + postIndexLow) / 2**52
|
390
|
+
// = 1 + ((postIndexHigh & 0xfffff) * 2**32 + postIndexLow) * Number.EPSILON
|
391
|
+
const significand = 1 + ((postIndexHigh & 0xfffff) * 2 ** 32 + index.data[1]) * Number.EPSILON;
|
392
|
+
return significand * 2 ** exponent;
|
393
|
+
}
|
394
|
+
|
395
|
+
/**
|
396
|
+
* Same as {@link doubleToIndex} except it throws in case of invalid double
|
397
|
+
*
|
398
|
+
* @internal
|
399
|
+
*/
|
400
|
+
export function safeDoubleToIndex(d: number, label: string): IO<unknown, never, ArrayInt64> {
|
401
|
+
if (Number.isNaN(d)) {
|
402
|
+
// Number.NaN does not have any associated index in the current implementation
|
403
|
+
return IO.haltNow(new Error("fc.doubleNext constraints." + label + " must be a 32-bit float"));
|
404
|
+
}
|
405
|
+
return IO.succeedNow(doubleToIndex(d));
|
406
|
+
}
|
407
|
+
|
408
|
+
const EPSILON = Math.pow(2, -52);
|
409
|
+
const MAX_VALUE = (2 - EPSILON) * Math.pow(2, 1023);
|
410
|
+
const MIN_VALUE = Math.pow(2, -1022);
|
411
|
+
|
412
|
+
export function nextUp(x: number) {
|
413
|
+
if (x !== x) {
|
414
|
+
return x;
|
415
|
+
}
|
416
|
+
if (x === -1 / 0) {
|
417
|
+
return -MAX_VALUE;
|
418
|
+
}
|
419
|
+
if (x === +1 / 0) {
|
420
|
+
return +1 / 0;
|
421
|
+
}
|
422
|
+
if (x === +MAX_VALUE) {
|
423
|
+
return +1 / 0;
|
424
|
+
}
|
425
|
+
let y = x * (x < 0 ? 1 - EPSILON / 2 : 1 + EPSILON);
|
426
|
+
if (y === x) {
|
427
|
+
y = MIN_VALUE * EPSILON > 0 ? x + MIN_VALUE * EPSILON : x + MIN_VALUE;
|
428
|
+
}
|
429
|
+
if (y === +1 / 0) {
|
430
|
+
y = +MAX_VALUE;
|
431
|
+
}
|
432
|
+
const b = x + (y - x) / 2;
|
433
|
+
if (x < b && b < y) {
|
434
|
+
y = b;
|
435
|
+
}
|
436
|
+
const c = (y + x) / 2;
|
437
|
+
if (x < c && c < y) {
|
438
|
+
y = c;
|
439
|
+
}
|
440
|
+
return y === 0 ? -0 : y;
|
441
|
+
}
|
442
|
+
|
443
|
+
export function nextAfter(x: number, y: number) {
|
444
|
+
return y < x ? -nextUp(-x) : y > x ? nextUp(x) : x !== x ? x : y;
|
445
|
+
}
|
446
|
+
|
447
|
+
export function computeBiasedRanges(
|
448
|
+
min: ArrayInt64,
|
449
|
+
max: ArrayInt64,
|
450
|
+
biasedRanges?: { min: ArrayInt64; max: ArrayInt64 }[],
|
451
|
+
): { min: ArrayInt64; max: ArrayInt64 }[] {
|
452
|
+
if (biasedRanges != null) {
|
453
|
+
return biasedRanges;
|
454
|
+
}
|
455
|
+
if (isEqual64(min, max)) {
|
456
|
+
return [{ min, max }];
|
457
|
+
}
|
458
|
+
const minStrictlySmallerThanZero = isStrictlyNegative64(min);
|
459
|
+
const maxStrictlyGreaterThanZero = isStrictlyPositive64(max);
|
460
|
+
if (minStrictlySmallerThanZero && maxStrictlyGreaterThanZero) {
|
461
|
+
const logMin = logLike64(min);
|
462
|
+
const logMax = logLike64(max);
|
463
|
+
return [
|
464
|
+
{ min: logMin, max: logMax },
|
465
|
+
{ min: substract64(max, logMax), max },
|
466
|
+
{ min, max: substract64(min, logMin) },
|
467
|
+
];
|
468
|
+
} else {
|
469
|
+
const logGap = logLike64(substract64(max, min));
|
470
|
+
const closeToMin = { min, max: add64(min, logGap) };
|
471
|
+
const closeToMax = { min: substract64(max, logGap), max };
|
472
|
+
return minStrictlySmallerThanZero ? [closeToMax, closeToMin] : [closeToMin, closeToMax];
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
export function computeArrayInt64GenerateRange(
|
477
|
+
min: ArrayInt64,
|
478
|
+
max: ArrayInt64,
|
479
|
+
biasFactor: number | undefined,
|
480
|
+
biasedRanges: { min: ArrayInt64; max: ArrayInt64 }[] | undefined,
|
481
|
+
): URIO<unknown, { min: ArrayInt64; max: ArrayInt64 }> {
|
482
|
+
return IO.gen(function* (_) {
|
483
|
+
if (biasFactor === undefined || (yield* _(Random.nextIntBetween(1, biasFactor))) !== 1) {
|
484
|
+
return { min, max };
|
485
|
+
}
|
486
|
+
const ranges = computeBiasedRanges(min, max, biasedRanges);
|
487
|
+
if (ranges.length === 1) {
|
488
|
+
return ranges[0]!;
|
489
|
+
}
|
490
|
+
const id = yield* _(Random.nextIntBetween(-2 * (ranges.length - 1), ranges.length - 2));
|
491
|
+
return id < 0 ? ranges[0]! : ranges[id + 1]!;
|
492
|
+
});
|
493
|
+
}
|
494
|
+
|
495
|
+
export function clamp(n: number, min: number, max: number): number {
|
496
|
+
return n < min ? min : n > max ? max : n;
|
497
|
+
}
|
package/api.d.ts
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
import { IO } from "@fncts/io/IO";
|
2
|
+
import { Lazy } from "@fncts/base/data/function/definition";
|
3
|
+
import type { Assertion, AssertResult } from "./control/Assertion.js";
|
4
|
+
import type { AssertionIO } from "./control/AssertionIO.js";
|
5
|
+
import type { TestResult } from "./data/FailureDetails.js";
|
6
|
+
import type { _E, _R } from "@fncts/base/types";
|
7
|
+
import { Spec } from "./control/Spec.js";
|
8
|
+
export declare function traverseResult<A>(value: A, assertResult: AssertResult<A>, assertion: AssertionIO<A>): TestResult;
|
9
|
+
/**
|
10
|
+
* @tsplus fluent global assert 1
|
11
|
+
* @tsplus location "@fncts/test/api"
|
12
|
+
*/
|
13
|
+
export declare function assert_<A>(value: A, assertion: Assertion<A>): TestResult;
|
14
|
+
/**
|
15
|
+
* @tsplus fluent global assert 0
|
16
|
+
* @tsplus location "@fncts/test/api"
|
17
|
+
*/
|
18
|
+
export declare function assertIO_<R, E, A>(io: IO<R, E, A>, assertion: AssertionIO<A>): IO<R, E, TestResult>;
|
19
|
+
export declare function suite<Specs extends ReadonlyArray<Spec<any, any>>>(label: string, ...specs: Specs): Spec<_R<Specs[number]>, _E<Specs[number]>>;
|
20
|
+
export declare function testIO<R, E>(label: string, assertion: Lazy<IO<R, E, TestResult>>): Spec<R, E>;
|
21
|
+
export declare function test(label: string, assertion: Lazy<TestResult>): Spec<unknown, never>;
|