UNPKG

xen-dev-utils

Version:

Utility functions used by the Scale Workshop ecosystem

1,859 lines 39.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const vitest_1 = require("vitest"); const fraction_1 = require("../fraction"); // License: MIT // Copyright (c) 2023 Robert Eisele // Modified for vitest by Lumi Pakkanen function DivisionByZero() { return new Error('Division by Zero'); } /* function InvalidParameter() { return new Error('Invalid argument'); } function NonIntegerParameter() { return new Error('Parameters must be integer'); } */ const tests = [ /* { set: '', expectError: InvalidParameter(), }, { set: 'foo', expectError: InvalidParameter(), }, { set: ' 123', expectError: InvalidParameter(), }, { set: 0, expect: 0, }, { set: 0.2, expect: '0.2', }, { set: 0.333, expect: '0.333', }, { set: 1.1, expect: '1.1', }, { set: 1.2, expect: '1.2', }, { set: 1.3, expect: '1.3', }, { set: 1.4, expect: '1.4', }, */ { set: 1.5, expect: '1.5', }, /* { set: 2.555, expect: '2.555', }, { set: ' - ', expectError: InvalidParameter(), }, */ { set: '.5', expect: '0.5', }, { set: '-.5', expect: '-0.5', }, { set: '123', expect: '123', }, { set: '-123', expect: '-123', }, { set: '123.4', expect: '123.4', }, { set: '-123.4', expect: '-123.4', }, { set: '123.', expect: '123', }, { set: '-123.', expect: '-123', }, { set: '123.4(56)', expect: '123.4(56)', }, { set: '-123.4(56)', expect: '-123.4(56)', }, { set: '123.(4)', expect: '123.(4)', }, { set: '-123.(4)', expect: '-123.(4)', }, { set: '0/0', expectError: DivisionByZero(), }, { set: '9/0', expectError: DivisionByZero(), }, { label: '0/1+0/1', set: '0/1', param: '0/1', expect: '0', }, { label: '1/9+0/1', set: '1/9', param: '0/1', expect: '0.(1)', }, /* { set: '123/456', expect: '0.269(736842105263157894)', }, { set: '-123/456', expect: '-0.269(736842105263157894)', }, */ /* { set: '19 123/456', expect: '19.269(736842105263157894)', }, { set: '-19 123/456', expect: '-19.269(736842105263157894)', }, { set: '123.(22)123', expectError: InvalidParameter(), }, */ { set: '+33.3(3)', expect: '33.(3)', }, { set: "3.'09009'", expect: '3.(09009)', }, /* { set: '123.(((', expectError: InvalidParameter(), }, { set: '123.((', expectError: InvalidParameter(), }, { set: '123.()', expectError: InvalidParameter(), }, { set: null, expect: '0', // I would say it's just fine }, */ { set: [22, 7], expect: '3.(142857)', // We got Pi! - almost ;o }, /* { set: '355/113', expect: '3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)', // Yay, a better PI }, { set: '3 1/7', expect: '3.(142857)', }, */ { set: [36, -36], expect: '-1', }, { set: '9/12', expect: '0.75', }, { set: '0.09(33)', expect: '0.09(3)', }, { set: 1 / 2, expect: '0.5', }, { set: 1 / 3, expect: '0.(3)', }, { set: "0.'3'", expect: '0.(3)', }, { set: '0.00002', expect: '0.00002', }, { set: 7 / 8, expect: '0.875', }, { set: '0.003', expect: '0.003', }, { set: 4, expect: '4', }, { set: -99, expect: '-99', }, { set: '-92332.1192', expect: '-92332.1192', }, { set: '88.92933(12111)', expect: '88.92933(12111)', }, { set: '-192322.823(123)', expect: '-192322.8(231)', }, { label: '-99.12 % 0.09(34)', set: '-99.12', fn: 'mod', param: '0.09(34)', expect: '-0.07(95)', }, { label: '0.4 / 0.1', set: 0.4, fn: 'div', param: '.1', expect: '4', }, { label: '1 / -.1', set: 1, fn: 'div', param: '-.1', expect: '-10', }, { label: '1 - (-1)', set: 1, fn: 'sub', param: '-1', expect: '2', }, { label: '1 + (-1)', set: 1, fn: 'add', param: '-1', expect: '0', }, { label: '-187 % 12', set: '-187', fn: 'mod', param: '12', expect: '-7', }, { label: 'Negate by 99 * -1', set: '99', fn: 'mul', param: '-1', expect: '-99', }, { set: [20, -5], expect: '-4', fn: 'toFraction', param: true, }, /* { set: [-10, -7], expect: '1 3/7', fn: 'toFraction', param: true, }, { set: [21, -6], expect: '-3 1/2', fn: 'toFraction', param: true, }, */ { set: '10/78', expect: '5/39', fn: 'toFraction', param: true, }, { set: '0/91', expect: '0', fn: 'toFraction', param: true, }, { set: '-0/287', expect: '0', fn: 'toFraction', param: true, }, { set: '-5/20', expect: '-1/4', fn: 'toFraction', param: true, }, /* { set: '42/9', expect: '4 2/3', fn: 'toFraction', param: true, }, { set: '71/23', expect: '3 2/23', fn: 'toFraction', param: true, }, */ { set: '6/3', expect: '2', fn: 'toFraction', param: true, }, { set: '28/4', expect: '7', fn: 'toFraction', param: true, }, { set: '105/35', expect: '3', fn: 'toFraction', param: true, }, { set: '4/6', expect: '2/3', fn: 'toFraction', param: true, }, { label: '99.(9) + 66', set: '99.(999999)', fn: 'add', param: '66', expect: '166', }, /* { label: '-82.124 / 66.(3)', set: '-82.124', fn: 'div', param: '66.(3)', expect: '-1.238(050251256281407035175879396984924623115577889447236180904522613065326633165829145728643216080402010)', }, */ { label: '100 - .91', set: '100', fn: 'sub', param: '.91', expect: '99.09', }, /* { label: '381.(33411) % 11.119(356)', set: '381.(33411)', fn: 'mod', param: '11.119(356)', expect: '3.275(997225017295217)', }, */ { label: '13/26 mod 1', set: '13/26', fn: 'mod', param: '1.000', expect: '0.5', }, { label: '381.(33411) % 1', // Extract fraction part of a number set: '381.(33411)', fn: 'mod', param: '1', expect: '0.(33411)', }, { label: '-222/3', set: { n: 3, d: 222, s: -1, }, fn: 'inverse', param: null, expect: '-74', }, { label: 'inverse', set: 1 / 2, fn: 'inverse', param: null, expect: '2', }, { label: 'abs(-222/3)', set: { n: -222, d: 3, }, fn: 'abs', param: null, expect: '74', }, { label: '9 % -2', set: 9, fn: 'mod', param: '-2', expect: '1', }, { label: '-9 % 2', set: '-9', fn: 'mod', param: '-2', expect: '-1', }, { label: '1 / 195312500', set: '1', fn: 'div', param: '195312500', expect: '0.00000000512', }, { label: '10 / 0', set: 10, fn: 'div', param: 0, expectError: DivisionByZero(), }, { label: '-3 / 4', set: [-3, 4], fn: 'inverse', param: null, expect: '-1.(3)', }, { label: '-19.6', set: [-98, 5], fn: 'equals', param: '-19.6', expect: 'true', // actually, we get a real bool but we call toString() in the test below }, { label: '-19.6', set: [98, -5], fn: 'equals', param: '-19.6', expect: 'true', }, { label: '99/88', set: [99, 88], fn: 'equals', param: [88, 99], expect: 'false', }, { label: '99/88', set: [99, -88], fn: 'equals', param: [9, 8], expect: 'false', }, { label: '12.5', set: 12.5, fn: 'add', param: 0, expect: '12.5', }, { label: '0/1 -> 1/0', set: 0, fn: 'inverse', param: null, expectError: DivisionByZero(), }, { label: 'abs(-100.25)', set: -100.25, fn: 'abs', param: null, expect: '100.25', }, { label: '0.022222222', set: '0.0(22222222)', fn: 'abs', param: null, expect: '0.0(2)', }, { label: '1.5 | 100.5', set: 100.5, fn: 'divisible', param: '1.5', expect: 'true', }, { label: '1.5 | 100.6', set: 100.6, fn: 'divisible', param: 1.6, expect: 'false', }, { label: '(1/6) | (2/3)', // == 4 set: [2, 3], fn: 'divisible', param: [1, 6], expect: 'true', }, { label: '(1/6) | (2/5)', set: [2, 5], fn: 'divisible', param: [1, 6], expect: 'false', }, { label: '0 | (2/5)', set: [2, 5], fn: 'divisible', param: 0, expect: 'false', }, { label: '6 | 0', set: 0, fn: 'divisible', param: 6, expect: 'true', }, /* { label: 'fmod(4.55, 0.05)', // http://phpjs.org/functions/fmod/ (comment section) set: 4.55, fn: 'mod', param: 0.05, expect: '0', }, { label: 'fmod(99.12, 0.4)', set: 99.12, fn: 'mod', param: '0.4', expect: '0.32', }, { label: 'fmod(fmod(1.0,0.1))', // http://stackoverflow.com/questions/4218961/why-fmod1-0-0-1-1 set: 1.0, fn: 'mod', param: 0.1, expect: '0', }, { label: "bignum", set: [5385020324, 1673196525], fn: "add", param: 0, expect: "3.21(840276592733181776121606516006839065124164060763872313206005492988936251824931324190982287630557922656455433410609073551596098372245902196097377144624418820138297860736950789447760776337973807350574075570710380240599651018280712721418065340531352107607323652551812465663589637206543923464101146157950573080469432602963360804254598843372567965379918536467197121390148715495330113717514444395585868193217769203770011415724163065662594535928766646225254382476081224230369471990147720394052336440275597631903998844367669243157195775313960803259497565595290726533154854597848271290188102679689703515252041298615534717298077104242133182771222884293284077911887845930112722413166618308629346454087334421161315763550250022184333666363549254920906556389124702491239037207539024741878423396797336762338781453063321417070239253574830368476888869943116813489676593728283053898883754853602746993512910863832926021645903191198654921901657666901979730085800889408373591978384009612977172541043856160291750546158945674358246709841810124486123947693472528578195558946669459524487119048971249805817042322628538808374587079661786890216019304725725509141850506771761314768448972244907094819599867385572056456428511886850828834945135927771544947477105237234460548500123140047759781236696030073335228807028510891749551057667897081007863078128255137273847732859712937785356684266362554153643129279150277938809369688357439064129062782986595074359241811119587401724970711375341877428295519559485099934689381452068220139292962014728066686607540019843156200674036183526020650801913421377683054893985)" }, */ { label: 'ceil(0.4)', set: 0.4, fn: 'ceil', param: null, expect: '1', }, { label: 'ceil(0.5)', set: 0.5, fn: 'ceil', param: null, expect: '1', }, /* { label: 'ceil(0.23, 2)', set: 0.23, fn: 'ceil', param: 2, expect: '0.23', }, */ { label: 'ceil(0.6)', set: 0.6, fn: 'ceil', param: null, expect: '1', }, { label: 'ceil(-0.4)', set: -0.4, fn: 'ceil', param: null, expect: '0', }, { label: 'ceil(-0.5)', set: -0.5, fn: 'ceil', param: null, expect: '0', }, { label: 'ceil(-0.6)', set: -0.6, fn: 'ceil', param: null, expect: '0', }, { label: 'floor(0.4)', set: 0.4, fn: 'floor', param: null, expect: '0', }, /* { label: 'floor(0.4, 1)', set: 0.4, fn: 'floor', param: 1, expect: '0.4', }, */ { label: 'floor(0.5)', set: 0.5, fn: 'floor', param: null, expect: '0', }, { label: 'floor(0.6)', set: 0.6, fn: 'floor', param: null, expect: '0', }, { label: 'floor(-0.4)', set: -0.4, fn: 'floor', param: null, expect: '-1', }, { label: 'floor(-0.5)', set: -0.5, fn: 'floor', param: null, expect: '-1', }, { label: 'floor(-0.6)', set: -0.6, fn: 'floor', param: null, expect: '-1', }, { label: 'floor(10.4)', set: 10.4, fn: 'floor', param: null, expect: '10', }, /* { label: 'floor(10.4, 1)', set: 10.4, fn: 'floor', param: 1, expect: '10.4', }, */ { label: 'floor(10.5)', set: 10.5, fn: 'floor', param: null, expect: '10', }, { label: 'floor(10.6)', set: 10.6, fn: 'floor', param: null, expect: '10', }, { label: 'floor(-10.4)', set: -10.4, fn: 'floor', param: null, expect: '-11', }, { label: 'floor(-10.5)', set: -10.5, fn: 'floor', param: null, expect: '-11', }, { label: 'floor(-10.6)', set: -10.6, fn: 'floor', param: null, expect: '-11', }, /* { label: 'floor(-10.543,3)', set: -10.543, fn: 'floor', param: 3, expect: '-10.543', }, { label: 'floor(10.543,3)', set: 10.543, fn: 'floor', param: 3, expect: '10.543', }, { label: 'round(-10.543,3)', set: -10.543, fn: 'round', param: 3, expect: '-10.543', }, { label: 'round(10.543,3)', set: 10.543, fn: 'round', param: 3, expect: '10.543', }, */ { label: 'round(10.4)', set: 10.4, fn: 'round', param: null, expect: '10', }, { label: 'round(10.5)', set: 10.5, fn: 'round', param: null, expect: '11', }, /* { label: 'round(10.5, 1)', set: 10.5, fn: 'round', param: 1, expect: '10.5', }, */ { label: 'round(10.6)', set: 10.6, fn: 'round', param: null, expect: '11', }, { label: 'round(-10.4)', set: -10.4, fn: 'round', param: null, expect: '-10', }, { label: 'round(-10.5)', set: -10.5, fn: 'round', param: null, expect: '-10', }, { label: 'round(-10.6)', set: -10.6, fn: 'round', param: null, expect: '-11', }, { label: 'round(-0.4)', set: -0.4, fn: 'round', param: null, expect: '0', }, { label: 'round(-0.5)', set: -0.5, fn: 'round', param: null, expect: '0', }, { label: 'round(-0.6)', set: -0.6, fn: 'round', param: null, expect: '-1', }, { label: 'round(-0)', set: -0, fn: 'round', param: null, expect: '0', }, /* { label: 'round(big fraction)', set: [ '409652136432929109317120'.repeat(100), '63723676445298091081155'.repeat(100), ], fn: 'round', param: null, expect: '6428570341270001560623330590225448467479093479780591305451264291405695842465355472558570608574213642', }, { label: 'round(big numerator)', set: ['409652136432929109317'.repeat(100), 10], fn: 'round', param: null, expect: '409652136432929109317'.repeat(99) + '40965213643292910932', }, { label: '17402216385200408/5539306332998545', set: [17402216385200408, 5539306332998545], fn: 'add', param: 0, expect: '3.141587653589870', }, { label: '17402216385200401/553930633299855', set: [17402216385200401, 553930633299855], fn: 'add', param: 0, expect: '31.415876535898660', }, { label: '1283191/418183', set: [1283191, 418183], fn: 'add', param: 0, expect: '3.068491545567371', }, */ { label: '1.001', set: '1.001', fn: 'add', param: 0, expect: '1.001', }, { label: '99+1', set: [99, 1], fn: 'add', param: 1, expect: '100', }, { label: 'gcd(5/8, 3/7)', set: [5, 8], fn: 'gcd', param: [3, 7], expect: '1/56', }, { label: 'gcd(52, 39)', set: 52, fn: 'gcd', param: 39, expect: '13', }, { label: 'gcd(51357, 3819)', set: 51357, fn: 'gcd', param: 3819, expect: '57', }, { label: 'gcd(841, 299)', set: 841, fn: 'gcd', param: 299, expect: '1', }, { label: 'gcd(2/3, 7/5)', set: [2, 3], fn: 'gcd', param: [7, 5], expect: '1/15', }, { label: 'lcm(-3, 3)', set: -3, fn: 'lcm', param: 3, expect: '-3', // Deviates from rawify's convention }, { label: 'lcm(3,-3)', set: 3, fn: 'lcm', param: -3, expect: '-3', // Deviates from rawify's convention }, { label: 'lcm(0,3)', set: 0, fn: 'lcm', param: 3, expect: '0', }, { label: 'lcm(3, 0)', set: 3, fn: 'lcm', param: 0, expect: '0', }, { label: 'lcm(0, 0)', set: 0, fn: 'lcm', param: 0, expect: '0', }, { label: 'lcm(200, 333)', set: 200, fn: 'lcm', param: 333, expect: '66600', }, { label: '1 + -1', set: 1, fn: 'add', param: -1, expect: '0', }, { label: '3/10+3/14', set: '3/10', fn: 'add', param: '3/14', expect: '0.5(142857)', }, { label: '3/10-3/14', set: '3/10', fn: 'sub', param: '3/14', expect: '0.0(857142)', }, { label: '3/10*3/14', set: '3/10', fn: 'mul', param: '3/14', expect: '0.06(428571)', }, { label: '3/10 / 3/14', set: '3/10', fn: 'div', param: '3/14', expect: '1.4', }, { label: '1-2', set: '1', fn: 'sub', param: '2', expect: '-1', }, { label: '1--1', set: '1', fn: 'sub', param: '-1', expect: '2', }, { label: '0/1*1/3', set: '0/1', fn: 'mul', param: '1/3', expect: '0', }, { label: '3/10 * 8/12', set: '3/10', fn: 'mul', param: '8/12', expect: '0.2', }, { label: '.5+5', set: '.5', fn: 'add', param: 5, expect: '5.5', }, { label: '10/12-5/60', set: '10/12', fn: 'sub', param: '5/60', expect: '0.75', }, { label: '10/15 / 3/4', set: '10/15', fn: 'div', param: '3/4', expect: '0.(8)', }, { label: '1/4 + 3/8', set: '1/4', fn: 'add', param: '3/8', expect: '0.625', }, { label: '2-1/3', set: '2', fn: 'sub', param: '1/3', expect: '1.(6)', }, { label: '5*6', set: '5', fn: 'mul', param: 6, expect: '30', }, { label: '1/2-1/5', set: '1/2', fn: 'sub', param: '1/5', expect: '0.3', }, { label: '1/2-5', set: '1/2', fn: 'add', param: -5, expect: '-4.5', }, { label: '1*-1', set: '1', fn: 'mul', param: -1, expect: '-1', }, { label: '5/10', set: 5.0, fn: 'div', param: 10, expect: '0.5', }, { label: '1/-1', set: '1', fn: 'div', param: -1, expect: '-1', }, { label: '4/5 + 13/2', set: '4/5', fn: 'add', param: '13/2', expect: '7.3', }, { label: '4/5 + 61/2', set: '4/5', fn: 'add', param: '61/2', expect: '31.3', }, { label: '0.8 + 6.5', set: '0.8', fn: 'add', param: '6.5', expect: '7.3', }, { label: '2/7 inverse', set: '2/7', fn: 'inverse', param: null, expect: '3.5', }, { label: 'neg 1/3', set: '1/3', fn: 'neg', param: null, expect: '-0.(3)', }, { label: '1/2+1/3', set: '1/2', fn: 'add', param: '1/3', expect: '0.8(3)', }, { label: '1/2+3', set: '.5', fn: 'add', param: 3, expect: '3.5', }, { label: '1/2+3.14', set: '1/2', fn: 'add', param: '3.14', expect: '3.64', }, { label: '3.5 < 4.1', set: 3.5, fn: 'compare', param: 4.1, expect: '-1', }, { label: '3.5 > 4.1', set: 4.1, fn: 'compare', param: 3.1, expect: '1', }, { label: '-3.5 > -4.1', set: -3.5, fn: 'compare', param: -4.1, expect: '1', }, { label: '-3.5 > -4.1', set: -4.1, fn: 'compare', param: -3.5, expect: '-1', }, { label: '4.3 == 4.3', set: 4.3, fn: 'compare', param: 4.3, expect: '0', }, { label: '-4.3 == -4.3', set: -4.3, fn: 'compare', param: -4.3, expect: '0', }, { label: '-4.3 < 4.3', set: -4.3, fn: 'compare', param: 4.3, expect: '-1', }, { label: '4.3 == -4.3', set: 4.3, fn: 'compare', param: -4.3, expect: '1', }, { label: '2^0.5', set: 2, fn: 'pow', param: 0.5, expect: 'null', }, { label: 'sqrt(0)', set: 0, fn: 'pow', param: 0.5, expect: '0', }, { label: '27^(2/3)', set: 27, fn: 'pow', param: '2/3', expect: '9', }, { label: '(243/1024)^(2/5)', set: '243/1024', fn: 'pow', param: '2/5', expect: '0.5625', }, { label: '-0.5^-3', set: -0.5, fn: 'pow', param: -3, expect: '-8', }, { label: '', set: -3, fn: 'pow', param: -3, expect: '-0.(037)', }, { label: '-3', set: -3, fn: 'pow', param: 2, expect: '9', }, { label: '-3', set: -3, fn: 'pow', param: 3, expect: '-27', }, { label: '0^0', set: 0, fn: 'pow', param: 0, expect: '1', }, { label: '2/3^7', set: [2, 3], fn: 'pow', param: 7, expect: '128/2187', }, { label: '-0.6^4', set: '-0.6', fn: 'pow', param: 4, expect: '0.1296', }, { label: '8128371/12394 - 8128371/12394', set: '8128371/12394', fn: 'sub', param: '8128371/12394', expect: '0', }, { label: '3/4 + 1/4', set: '3/4', fn: 'add', param: '1/4', expect: '1', }, { label: '1/10 + 2/10', set: '1/10', fn: 'add', param: '2/10', expect: '0.3', }, { label: '5/10 + 2/10', set: '5/10', fn: 'add', param: '2/10', expect: '0.7', }, { label: '18/10 + 2/10', set: '18/10', fn: 'add', param: '2/10', expect: '2', }, { label: '1/3 + 1/6', set: '1/3', fn: 'add', param: '1/6', expect: '0.5', }, { label: '1/3 + 2/6', set: '1/3', fn: 'add', param: '2/6', expect: '0.(6)', }, { label: '3/4 / 1/4', set: '3/4', fn: 'div', param: '1/4', expect: '3', }, { label: '1/10 / 2/10', set: '1/10', fn: 'div', param: '2/10', expect: '0.5', }, { label: '5/10 / 2/10', set: '5/10', fn: 'div', param: '2/10', expect: '2.5', }, { label: '18/10 / 2/10', set: '18/10', fn: 'div', param: '2/10', expect: '9', }, { label: '1/3 / 1/6', set: '1/3', fn: 'div', param: '1/6', expect: '2', }, { label: '1/3 / 2/6', set: '1/3', fn: 'div', param: '2/6', expect: '1', }, { label: '3/4 * 1/4', set: '3/4', fn: 'mul', param: '1/4', expect: '0.1875', }, { label: '1/10 * 2/10', set: '1/10', fn: 'mul', param: '2/10', expect: '0.02', }, { label: '5/10 * 2/10', set: '5/10', fn: 'mul', param: '2/10', expect: '0.1', }, { label: '18/10 * 2/10', set: '18/10', fn: 'mul', param: '2/10', expect: '0.36', }, { label: '1/3 * 1/6', set: '1/3', fn: 'mul', param: '1/6', expect: '0.0(5)', }, { label: '1/3 * 2/6', set: '1/3', fn: 'mul', param: '2/6', expect: '0.(1)', }, { label: '5/4 - 1/4', set: '5/4', fn: 'sub', param: '1/4', expect: '1', }, { label: '5/10 - 2/10', set: '5/10', fn: 'sub', param: '2/10', expect: '0.3', }, { label: '9/10 - 2/10', set: '9/10', fn: 'sub', param: '2/10', expect: '0.7', }, { label: '22/10 - 2/10', set: '22/10', fn: 'sub', param: '2/10', expect: '2', }, { label: '2/3 - 1/6', set: '2/3', fn: 'sub', param: '1/6', expect: '0.5', }, /* { label: '3/3 - 2/6', set: '3/3', fn: 'sub', param: '2/6', expect: '0.(6)', }, { label: '0.006999999999999999', set: 0.006999999999999999, fn: 'add', param: 0, expect: '0.007', }, { label: '1/7 - 1', set: 1 / 7, fn: 'add', param: -1, expect: '-0.(857142)', }, */ { label: '0.0065 + 0.0005', set: '0.0065', fn: 'add', param: '0.0005', expect: '0.007', }, { label: '6.5/.5', set: 6.5, fn: 'div', param: 0.5, expect: '13', }, /* { label: '0.999999999999999999999999999', set: 0.999999999999999999999999999, fn: 'sub', param: 1, expect: '0', }, { label: '0.5833333333333334', set: 0.5833333333333334, fn: 'add', param: 0, expect: '0.58(3)', }, { label: '1.75/3', set: 1.75 / 3, fn: 'add', param: 0, expect: '0.58(3)', }, { label: '3.3333333333333', set: 3.3333333333333, fn: 'add', param: 0, expect: '3.(3)', }, { label: '4.285714285714285714285714', set: 4.285714285714285714285714, fn: 'add', param: 0, expect: '4.(285714)', }, */ { label: '-4', set: -4, fn: 'neg', param: 0, expect: '4', }, { label: '4', set: 4, fn: 'neg', param: 0, expect: '-4', }, { label: '0', set: 0, fn: 'neg', param: 0, expect: '0', }, /* { label: '6869570742453802/5329686054127205', set: '6869570742453802/5329686054127205', fn: 'neg', param: 0, expect: '-1.288925965373540', }, { label: '686970702/53212205', set: '686970702/53212205', fn: 'neg', param: 0, expect: '-12.910021338149772', }, { label: '1/3000000000000000', set: '1/3000000000000000', fn: 'add', param: 0, expect: '0.000000000000000(3)', }, { label: 'toString(15) .0000000000000003', set: '.0000000000000003', fn: 'toString', param: 15, expect: '0.000000000000000', }, { label: 'toString(16) .0000000000000003', set: '.0000000000000003', fn: 'toString', param: 16, expect: '0.0000000000000003', }, { label: 'NAN', set: NaN, fn: 'toString', param: null, expect: 'NaN', }, { label: '12 / 4.3', set: 12, set2: 4.3, fn: 'toString', param: null, expectError: NonIntegerParameter(), }, { label: '12.5 / 4', set: 12.5, set2: 4, fn: 'toString', param: null, expectError: NonIntegerParameter(), }, */ { label: '0.9 round to multiple of 1/8', set: 0.9, fn: 'roundTo', param: '1/8', expect: '0.875', }, { label: '1/3 round to multiple of 1/16', set: 1 / 3, fn: 'roundTo', param: '1/16', expect: '0.3125', }, { label: '1/3 round to multiple of 1/16', set: -1 / 3, fn: 'roundTo', param: '1/16', expect: '-0.3125', }, ]; function toQuoteCycle(value) { if (typeof value === 'string') { return value.replace('(', "'").replace(')', "'"); } return value; } (0, vitest_1.describe)('Fraction', () => { for (let i = 0; i < tests.length; i++) { const testCase = tests[i]; let action; let set; let set2; if (Array.isArray(testCase.set)) { set = testCase.set[0]; set2 = testCase.set[1]; } else { set = testCase.set; if ('set2' in testCase) { set2 = testCase.set2; } } set = toQuoteCycle(set); const fn = testCase.fn; if (fn !== undefined || testCase.param !== undefined) { action = () => { let param = testCase.param; if (Array.isArray(param)) { param = new fraction_1.Fraction(param[0], param[1]); } param = toQuoteCycle(param); const x = new fraction_1.Fraction(set, set2)[fn ?? 'add'](param); return x; }; } else { action = () => { const x = new fraction_1.Fraction(set, set2); return x; }; } (0, vitest_1.it)(String(testCase.label || testCase.set), () => { if (testCase.expectError) { (0, vitest_1.expect)(action).toThrowError(testCase.expectError); } else { const x = action(); if (x === null) { (0, vitest_1.expect)(testCase.expect).toBe('null'); } else if (typeof x === 'number') { (0, vitest_1.expect)(Math.sign(x)).toBeCloseTo(testCase.expect); } else if (x instanceof fraction_1.Fraction) { const expected = new fraction_1.Fraction(toQuoteCycle(testCase.expect)); (0, vitest_1.expect)(x.equals(expected), `${x.toFraction()} != ${expected.toFraction()} = ${testCase.expect}`).toBe(true); } else { (0, vitest_1.expect)(x.toString()).toBe(testCase.expect); } } }); } }); (0, vitest_1.describe)('Arguments', () => { vitest_1.it.each([ ['0.1', '1/10'], ['6234/6460', '3117/3230'], [{ n: 1, d: 3 }, '1/3'], ])('Should be possible to use param %s', (param, expected) => { const fraction = new fraction_1.Fraction(param); (0, vitest_1.expect)(`${fraction.n}/${fraction.d}`).toBe(expected); (0, vitest_1.expect)(fraction.s).toBe(1); }); }); (0, vitest_1.describe)('fractions', () => { (0, vitest_1.it)('Should pass 0.08 = 2/25', () => { const fraction = new fraction_1.Fraction('0.08'); (0, vitest_1.expect)('2/25').toBe(`${fraction.n}/${fraction.d}`); }); (0, vitest_1.it)('Should pass 0.200 = 1/5', () => { const fraction = new fraction_1.Fraction('0.200'); (0, vitest_1.expect)('1/5').toBe(`${fraction.n}/${fraction.d}`); }); (0, vitest_1.it)('Should pass 0.125 = 1/8', () => { const fraction = new fraction_1.Fraction('0.125'); (0, vitest_1.expect)('1/8').toBe(`${fraction.n}/${fraction.d}`); }); (0, vitest_1.it)('Should pass 8.36 = 209/25', () => { const fraction = new fraction_1.Fraction(8.36).simplify(); (0, vitest_1.expect)('209/25').toBe(`${fraction.n}/${fraction.d}`); }); (0, vitest_1.it)('Should add complex values', () => { const fraction = new fraction_1.Fraction(-1023461776, 334639305); const sum = fraction.add({ n: 4, d: 25 }); (0, vitest_1.expect)('-4849597436/1673196525').toBe(`${sum.s * sum.n}/${sum.d}`); }); }); (0, vitest_1.describe)('Fraction Output', () => { (0, vitest_1.it)('Should pass -1.0000000000 = -1', () => { const fraction = new fraction_1.Fraction('-1.0000000000'); (0, vitest_1.expect)('-1').toBe(fraction.toFraction()); }); (0, vitest_1.it)('Should pass -0.0000000000 = 0', () => { const fraction = new fraction_1.Fraction('-0.0000000000'); (0, vitest_1.expect)('0').toBe(fraction.toFraction()); }); (0, vitest_1.it)('Should pass 1/-99/293 = -1/29007', () => { const fraction = new fraction_1.Fraction(-99).inverse().div(293); (0, vitest_1.expect)('-1/29007').toBe(fraction.toFraction()); }); (0, vitest_1.it)('Should work with large calculations', () => { const x = new fraction_1.Fraction(1123875); const y = new fraction_1.Fraction(1238750184); const z = new fraction_1.Fraction(1657134); const r = new fraction_1.Fraction(77344464613500, 92063); (0, vitest_1.expect)(x.mul(y).div(z).toFraction()).toBe(r.toFraction()); }); }); (0, vitest_1.describe)('Fraction toContinued', () => { (0, vitest_1.it)('Should pass 415/93', () => { const fraction = new fraction_1.Fraction(415, 93); (0, vitest_1.expect)('4,2,6,7').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 0/2', () => { const fraction = new fraction_1.Fraction(0, 2); (0, vitest_1.expect)('0').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 1/7', () => { const fraction = new fraction_1.Fraction(1, 7); (0, vitest_1.expect)('0,7').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 23/88', () => { const fraction = new fraction_1.Fraction('23/88'); (0, vitest_1.expect)('0,3,1,4,1,3').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 1/99', () => { const fraction = new fraction_1.Fraction('1/99'); (0, vitest_1.expect)('0,99').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 1768/99', () => { const fraction = new fraction_1.Fraction('1768/99'); (0, vitest_1.expect)('17,1,6,14').toBe(fraction.toContinued().toString()); }); (0, vitest_1.it)('Should pass 1768/99', () => { const fraction = new fraction_1.Fraction('7/8'); (0, vitest_1.expect)('0,1,7').toBe(fraction.toContinued().toString()); }); }); (0, vitest_1.describe)('Fraction simplify', () => { (0, vitest_1.it)('Should pass 415/93', () => { const fraction = new fraction_1.Fraction(415, 93); (0, vitest_1.expect)('9/2').toBe(fraction.simplify(0.1).toFraction()); (0, vitest_1.expect)('58/13').toBe(fraction.simplify(0.01).toFraction()); (0, vitest_1.expect)('415/93').toBe(fraction.simplify(0.0001).toFraction()); }); }); //# sourceMappingURL=fraction-rawify.spec.js.map