var assert = require('assert'); var Fraction = require('../fraction'); var tests = [{ set: "foo", expectError: Fraction.InvalidParameter }, { set: " 123", expectError: Fraction.InvalidParameter }, { set: 0, expect: 0 }, { set: .2, expect: "0.2" }, { set: .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: Fraction.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: Fraction.DivisionByZero }, { set: "9/0", expectError: Fraction.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: Fraction.InvalidParameter }, { set: "+33.3(3)", expect: "33.(3)" }, { set: "3.'09009'", expect: "3.(09009)" }, { set: "123.(((", expectError: Fraction.InvalidParameter }, { set: "123.((", expectError: Fraction.InvalidParameter }, { set: "123.()", expectError: Fraction.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: .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: Fraction.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: Fraction.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.(218402765927331817761216065160068390651241640607638723132060054929889362518249313241909822876305579226564554334106090735515960983722459021960973771446244188201382978607369507894477607763379738073505740755707103802405996510182807127214180653405313521076073236525518124656635896372065439234641011461579505730804694326029633608042545988433725679653799185364671971213901487154953301137175144443955858681932177692037700114157241630656625945359287666462252543824760812242303694719901477203940523364402755976319039988443676692431571957753139608032594975655952907265331548545978482712901881026796897035152520412986155347172980771042421331827712228842932840779118878459301127224131666183086293464540873344211613157635502500221843336663635492549209065563891247024912390372075390247418784233967973367623387814530633214170702392535748303684768888699431168134896765937282830538988837548536027469935129108638329260216459031911986549219016576669019797300858008894083735919783840096129771725410438561602917505461589456743582467098418101244861239476934725285781955589466694595244871190489712498058170423226285388083745870796617868902160193047257255091418505067717613147684489722449070948195998673855720564564285118868508288349451359277715449474771052372344605485001231400477597812366960300733352288070285108917495510576678970810078630781282551372738477328597129377853566842663625541536431292791502779388093696883574390641290627829865950743592418111195874017249707113753418774282955195594850999346893814520682201392929620147280666866075400198431562006740361835260206508019134213776830548939850326308799)" }, { 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: "round(0.4)", set: 0.4, fn: "round", param: null, expect: "0" }, { label: "round(0.5)", set: 0.5, fn: "round", param: null, expect: "1" }, { label: "round(0.5, 1)", set: 0.5, fn: "round", param: 1, expect: "0.5" }, { label: "round(0.6)", set: 0.6, fn: "round", param: null, expect: "1" }, { 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: "17402216385200408/5539306332998545", set: [17402216385200408, 5539306332998545], fn: "add", param: 0, expect: "3.14158765358987" }, { 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: "0.017(857142)" // == 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: "0.0(6)" // == 1/15 }, { label: "lcm(-3, 3)", set: -3, fn: "lcm", param: 3, expect: "3" }, { label: "lcm(3,-3)", set: 3, fn: "lcm", param: -3, expect: "3" }, { 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: "-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: "0.(058527663465935070873342478280749885688157293095564700502972107910379515317786922725194330132601737540009144947416552354823959762231367169638774577046181984453589391860996799268404206675811614083219021490626428898033836305441243712848651120256)" }, { 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: .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" } ]; describe('Fraction', function() { for (var i = 0; i < tests.length; i++) { (function(i) { var action; if (tests[i].fn) { action = function() { return new Fraction(tests[i].set)[tests[i].fn](tests[i].param).toString(); }; } else { action = function() { return new Fraction(tests[i].set).toString(); }; } it(String(tests[i].label || tests[i].set), function() { if(tests[i].expectError) { assert.throws(action, tests[i].expectError); } else { assert.equal(action(), tests[i].expect); } }); })(i); } }); describe('JSON', function() { it("Should be possible to stringify the object", function() { assert.equal('{"s":1,"n":14623,"d":330}', JSON.stringify(new Fraction("44.3(12)"))); assert.equal('{"s":-1,"n":2,"d":1}', JSON.stringify(new Fraction(-1 / 2).inverse())); }); }); describe('Arguments', function() { it("Should be possible to use different kind of params", function() { // String var fraction = new Fraction("0.1"); assert.equal("1/10", fraction.n + "/" + fraction.d); var fraction = new Fraction("6234/6460"); assert.equal("3117/3230", fraction.n + "/" + fraction.d); // Two params var fraction = new Fraction(1, 2); assert.equal("1/2", fraction.n + "/" + fraction.d); // Object var fraction = new Fraction({n: 1, d: 3}); assert.equal("1/3", fraction.n + "/" + fraction.d); // Array var fraction = new Fraction([1, 4]); assert.equal("1/4", fraction.n + "/" + fraction.d); }); }); describe('fractions', function() { it("Should pass 0.08 = 2/25", function() { var fraction = new Fraction("0.08"); assert.equal("2/25", fraction.n + "/" + fraction.d); }); it("Should pass 0.200 = 1/5", function() { var fraction = new Fraction("0.200"); assert.equal("1/5", fraction.n + "/" + fraction.d); }); it("Should pass 0.125 = 1/8", function() { var fraction = new Fraction("0.125"); assert.equal("1/8", fraction.n + "/" + fraction.d); }); it("Should pass 8.36 = 209/25", function() { var fraction = new Fraction(8.36); assert.equal("209/25", fraction.n + "/" + fraction.d); }); }); describe('constructors', function() { it("Should pass 0.08 = 2/25", function() { var tmp = new Fraction({d: 4, n: 2, s: -1}); assert.equal("-1/2", tmp.s * tmp.n + "/" + tmp.d); var tmp = new Fraction(-88.3); assert.equal("-883/10", tmp.s * tmp.n + "/" + tmp.d); var tmp = new Fraction(-88.3).clone(); assert.equal("-883/10", tmp.s * tmp.n + "/" + tmp.d); var tmp = new Fraction("123.'3'"); assert.equal("370/3", tmp.s * tmp.n + "/" + tmp.d); var tmp = new Fraction("123.'3'").clone(); assert.equal("370/3", tmp.s * tmp.n + "/" + tmp.d); var tmp = new Fraction([-1023461776, 334639305]); tmp = tmp.add([4, 25]); assert.equal("-4849597436/1673196525", tmp.s * tmp.n + "/" + tmp.d); }); }); describe('Latex Output', function() { it("Should pass 123.'3' = \\frac{370}{3}", function() { var tmp = new Fraction("123.'3'"); assert.equal("\\frac{370}{3}", tmp.toLatex()); }); it("Should pass 1.'3' = \\frac{4}{3}", function() { var tmp = new Fraction("1.'3'"); assert.equal("\\frac{4}{3}", tmp.toLatex()); }); it("Should pass -1.0000000000 = -1", function() { var tmp = new Fraction("-1.0000000000"); assert.equal('-1', tmp.toLatex()); }); it("Should pass -0.0000000000 = 0", function() { var tmp = new Fraction("-0.0000000000"); assert.equal('0', tmp.toLatex()); }); }); describe('Fraction Output', function() { it("Should pass 123.'3' = 123 1/3", function() { var tmp = new Fraction("123.'3'"); assert.equal('370/3', tmp.toFraction()); }); it("Should pass 1.'3' = 1 1/3", function() { var tmp = new Fraction("1.'3'"); assert.equal('4/3', tmp.toFraction()); }); it("Should pass -1.0000000000 = -1", function() { var tmp = new Fraction("-1.0000000000"); assert.equal('-1', tmp.toFraction()); }); it("Should pass -0.0000000000 = 0", function() { var tmp = new Fraction("-0.0000000000"); assert.equal('0', tmp.toFraction()); }); it("Should pass 1/-99/293 = -1/29007", function() { var tmp = new Fraction(-99).inverse().div(293); assert.equal('-1/29007', tmp.toFraction()); }); it('Should work with large calculations', function() { var x = Fraction(1123875); var y = Fraction(1238750184); var z = Fraction(1657134); var r = Fraction(77344464613500, 92063); assert.equal(x.mul(y).div(z).toFraction(), r.toFraction()); }); }); describe('Fraction toContined', function() { it("Should pass 415/93", function() { var tmp = new Fraction(415, 93); assert.equal('4,2,6,7', tmp.toContinued().toString()); }); it("Should pass 0/2", function() { var tmp = new Fraction(0, 2); assert.equal('0', tmp.toContinued().toString()); }); it("Should pass 1/7", function() { var tmp = new Fraction(1, 7); assert.equal('0,7', tmp.toContinued().toString()); }); it("Should pass 23/88", function() { var tmp = new Fraction('23/88'); assert.equal('0,3,1,4,1,3', tmp.toContinued().toString()); }); it("Should pass 1/99", function() { var tmp = new Fraction('1/99'); assert.equal('0,99', tmp.toContinued().toString()); }); it("Should pass 1768/99", function() { var tmp = new Fraction('1768/99'); assert.equal('17,1,6,14', tmp.toContinued().toString()); }); it("Should pass 1768/99", function() { var tmp = new Fraction('7/8'); assert.equal('0,1,7', tmp.toContinued().toString()); }); }); describe('Fraction NaN', function() { for (var i in Fraction.prototype) { (function(i) { if (Fraction.prototype[i] instanceof Function) switch (i) { case 'toFraction': case 'toContinued': case 'toLatex': case 'valueOf': case 'divisible': case 'compare': case 'equals': break; case 'toString': it("Should pass " + i, function() { var x = Fraction(NaN)[i](); assert.equal('NaN', x); }); break; case 'add': case 'sub': case 'mul': case 'div': case 'pow': case "gcd": case 'lcm': case 'equals': it("Should pass " + i, function() { var x = Fraction(NaN)[i](NaN); assert.equal('NaN NaN', x.d + " " + x.d); }); break; default: it("Should pass " + i, function() { var x = Fraction(NaN)[i](); assert.equal('NaN NaN', x.d + " " + x.d); }); } })(i); } });