UNPKG

mercury-lang

Version:

Parser for the mercury live coding language

337 lines (249 loc) 13 kB
// // List functions testing file // const Mercury = require('../index.js'); // const Mercury = require('../build/mercury.es5.min.js'); // Float arrays not included because results can not StrictEqual // (rounding errors with Floats) test('Generative List Methods', () => { expect(Mercury(`print spread(5 0 12)`).parseTree.print[0]).toStrictEqual([0, 2, 4, 7, 9]); expect(Mercury(`print spreadF(4)`).parseTree.print[0]).toStrictEqual([0, 0.25, 0.5, 0.75]); expect(Mercury(`print spread(5 12 0)`).parseTree.print[0]).toStrictEqual([9, 7, 4, 2, 0]); expect(Mercury(`print spreadInclusive(5 0 12)`).parseTree.print[0]).toStrictEqual([0, 3, 6, 9, 12]); expect(Mercury(`print spreadIncF(3)`).parseTree.print[0]).toStrictEqual([0, 0.5, 1]); expect(Mercury(`print fill(10 2 15 3 20 4)`).parseTree.print[0]).toStrictEqual([10, 10, 15, 15, 15, 20, 20, 20, 20]); expect(Mercury(`print fill(abc 2 xyz 3)`).parseTree.print[0]).toStrictEqual(['abc', 'abc', 'xyz', 'xyz', 'xyz']); expect(Mercury(`print fill([10 2 15 3 20 4])`).parseTree.print[0]).toStrictEqual([10, 10, 15, 15, 15, 20, 20, 20, 20]); expect(Mercury(`print fill([10 20] 2 [30 40] 3 50 4)`).parseTree.print[0]).toStrictEqual([[10, 20], [10, 20], [30, 40], [30, 40], [30, 40], 50, 50, 50, 50]); expect(Mercury(`print sine(10)`).parseTree.print[0]).toStrictEqual([6, 9, 11, 11, 9, 6, 2, 0, 0, 2]); expect(Mercury(`print sine(10 1 -12 12)`).parseTree.print[0]).toStrictEqual([0, 7, 11, 11, 7, 0, -7, -11, -11, -7]); expect(Mercury(`print sine(10 2 0 5)`).parseTree.print[0]).toStrictEqual([2, 4, 3, 1, 0, 2, 4, 3, 1, 0]); expect(Mercury(`print sineFloat()`).parseTree.print[0]).toStrictEqual([0]); expect(Mercury(`print sineF()`).parseTree.print[0]).toStrictEqual([0]); expect(Mercury(`print cosine(10)`).parseTree.print[0]).toStrictEqual([12, 10, 7, 4, 1, 0, 1, 4, 7, 10]); expect(Mercury(`print cosine(10 1 -12 12)`).parseTree.print[0]).toStrictEqual([12, 9, 3, -3, -9, -12, -9, -3, 3, 9]); expect(Mercury(`print cosine(10 2 0 5)`).parseTree.print[0]).toStrictEqual([5, 3, 0, 0, 3, 5, 3, 0, 0, 3]); expect(Mercury(`print cosineFloat()`).parseTree.print[0]).toStrictEqual([1]); expect(Mercury(`print cosF()`).parseTree.print[0]).toStrictEqual([1]); expect(Mercury(`print binary(358)`).parseTree.print[0]).toStrictEqual([1, 0, 1, 1, 0, 0, 1, 1, 0]); expect(Mercury(`print binary(4 3 5)`).parseTree.print[0]).toStrictEqual([1, 0, 0, 1, 1, 1, 0, 1]); expect(Mercury(`print spacing(2 3 2)`).parseTree.print[0]).toStrictEqual([1, 0, 1, 0, 0, 1, 0]); }); test('Algorithmic List Methods', () => { expect(Mercury(`print euclid(8 3)`).parseTree.print[0]).toStrictEqual([1,0,0,1,0,0,1,0]); expect(Mercury(`print hex(8892)`).parseTree.print[0]).toStrictEqual([1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0]); expect(Mercury(`print hex("fb")`).parseTree.print[0]).toStrictEqual([1,1,1,1,1,0,1,1]); expect(Mercury(`print fibonacci(8)`).parseTree.print[0]).toStrictEqual([0, 1, 1, 2, 3, 5, 8, 13]); expect(Mercury(`print fibonacci(5 7)`).parseTree.print[0]).toStrictEqual([13, 21, 34, 55, 89]); expect(Mercury(`print pisano(8)`).parseTree.print[0]).toStrictEqual([0, 1, 1, 2, 3, 5, 0, 5, 5, 2, 7, 1]); expect(Mercury(`print pisano(5 10)`).parseTree.print[0]).toStrictEqual([0, 1, 1, 2, 3, 0, 3, 3, 1, 4]); expect(Mercury(`print pell(8)`).parseTree.print[0]).toStrictEqual([0, 1, 2, 5, 12, 29, 70, 169]); expect(Mercury(`print lucas(8)`).parseTree.print[0]).toStrictEqual([2, 1, 3, 4, 7, 11, 18, 29]); expect(Mercury(`print threeFibonacci(8)`).parseTree.print[0]).toStrictEqual([0, 1, 3, 10, 33, 109, 360, 1189]); expect(Mercury(`print collatz()`).parseTree.print[0]).toStrictEqual([1, 2, 4, 8, 16, 5, 10, 3, 6]); expect(Mercury(`print collatzMod()`).parseTree.print[0]).toStrictEqual([1, 0, 0, 0, 0, 1, 0, 1, 0]); }); test('Stochastic List Methods', () => { expect(Mercury(`set randomSeed 1234`).parseTree.global.randomSeed).toStrictEqual([ 1234 ]); expect(Mercury(`print getSeed()`).parseTree.print[0]).toStrictEqual(1234); let code = ` set randomSeed 31415 print random(5) print random(5 12) print random(5 -12 12)` expect(Mercury(code).parseTree.print).toStrictEqual([[9, 4, 8, 3, 9], [10, 6, 5, 7, 2], [-7, 3, 8, 3, -5]]); code = ` set randomSeed 31415 print drunk(10 5 0 24) print drunk(10 4 0 12 6 false) ` expect(Mercury(code).parseTree.print).toStrictEqual([[13, 15, 19, 21, 22, 19, 22, 20, 23, 22], [5, 9, 11, 9, 6, 3, 4, 2, 1, 0]]); code = ` set randomSeed 31415 print urn(5) print urn(8 4) print urn(8 10 14)` expect(Mercury(code).parseTree.print).toStrictEqual([[9, 3, 6, 2, 11],[2, 3, 1, 0, 1, 3, 2, 0],[12, 13, 10, 11, 10, 11, 13, 12]]); code = ` set randomSeed 31415 print coin(5) print dice(5) print clave(5) print twelveTone()` expect(Mercury(code).parseTree.print).toStrictEqual([[1, 0, 1, 0, 1], [6, 4, 3, 4, 2], [1, 0, 1, 0, 0], [2, 9, 0, 6, 1, 11, 5, 8, 4, 3, 7, 10]]); code = ` set randomSeed 31415 print choose(4 spread(10)) print pick(4 spread(10)) print shuffle(spread(4)) print expand([0 3 2 5] 8) ` expect(Mercury(code).parseTree.print).toStrictEqual([[7, 3, 6, 3], [7, 9, 4, 3], [1, 3, 0, 2], [0, 3, 2, 5, 4, 7, 10, 13]]); code = ` set randomSeed 1234 list mkv markovTrain([1 2 3 4 3 2 1 3 1 4 2 3 2 4] 4) print markovChain(10 mkv) ` expect(Mercury(code).parseTree.print).toStrictEqual([[ 3, 1, 4, 2, 3, 2, 4, 4, 2, 3 ]]); code = ` set randomSeed 1234 list mkv markovTrain([1 2 3 4 3 2 1 3 1 4 2 3 2 4]) print markovChain(10 mkv) ` expect(Mercury(code).parseTree.print).toStrictEqual([[ 2, 4, 2, 3, 2, 1, 3, 1, 4, 2 ]]); }); test('Transform List Methods', () => { let code = ` print clone([0 3 7] 3 7) print join([1 2 3] [10 11 12]) print copy([0 3 7] 3) print every(euclid(8 5) 2 8 0 1) print pad([3 7 9] 8) print pad([c e g] 8 - 4) ` expect(Mercury(code).parseTree.print).toStrictEqual([[3, 6, 10, 7, 10, 14],[1, 2, 3, 10, 11, 12],[0, 3, 7, 0, 3, 7, 0, 3, 7], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1], [3, 7, 9, 0, 0, 0, 0, 0], ['-', '-', '-', '-', 'c', 'e', 'g', '-']]); code = ` print flat([1 [2 3 [ 4 ] 5] 6]) print invert([0 3 7 12]) print flip([0 3 7 12] 5) print invert([0 3 7 12] 3 10) print lace([0 3 7] [12 19]) print lookup([0 1 1 2 0] [10 11 12]) print get([8 -5 144 3.14] [c e g]) print palin([0 3 7 12]) print mirror([0 3 7 12] 1) print repeat([0 3 7] 4) print repeat([0 3 7] [2 3]) print repeat([c e g] [2 3]) print reverse([1 2 3 4]) print rotate([1 2 3 4] 2) print rot([1 2 3 4] -1) print filter([1 2 3 4] 3) ` expect(Mercury(code).parseTree.print).toStrictEqual([[1, 2, 3, 4, 5, 6],[12, 9, 5, 0],[10, 7, 3, -2],[13, 10, 6, 1],[0, 12, 3, 19, 7],[10, 11, 11, 12, 10],['g', 'e', 'c', 'c'],[0, 3, 7, 12, 12, 7, 3, 0],[0, 3, 7, 12, 7, 3],[0, 0, 0, 0, 3, 3, 3, 3, 7, 7, 7, 7],[0, 0, 3, 3, 3, 7, 7],['c', 'c', 'e', 'e', 'e', 'g', 'g'],[4, 3, 2, 1],[3, 4, 1, 2],[2, 3, 4, 1],[1, 2, 4]]); code = ` print sort(shuffle(spread(5))) print slice(spread(8) 3) print slice(spread(8) [3 2] 0) print split(spread(8) 3) print split(spread(8) [3 2]) print cut(spread(8) 3) print cutLast(spread(8) 3) print spray(spread(5 10 20) euclid(8 5)) print stretch([1 10 5] 9) print thin([1 1 2 2 3 3]) print unique([10 10 20 20 30 30])` expect(Mercury(code).parseTree.print).toStrictEqual([[0, 1, 2, 3, 4], [[0, 1, 2], [3, 4, 5, 6, 7]], [[0, 1, 2], [3, 4]], [[0, 1, 2], [3, 4, 5], [6, 7]], [[0, 1, 2], [3, 4], [5, 6, 7]], [0, 1, 2], [3, 4, 5, 6, 7], [10, 0, 12, 0, 14, 16, 0, 18], [1, 3, 5, 7, 10, 8, 7, 6, 5], [1, 2, 3], [10, 20, 30]]); code = ` print pinky([0 3 7 12 19]) print pinkyUp([0 3 7 12 19]) print pinkyDown([0 3 7 12 19]) print pinkyUpDown([0 3 7 12 19])` expect(Mercury(code).parseTree.print).toStrictEqual([[0, 19, 3, 19, 7, 19, 12, 19], [0, 19, 3, 19, 7, 19, 12, 19], [12, 19, 7, 19, 3, 19, 0, 19], [0, 19, 3, 19, 7, 19, 12, 19, 7, 19, 3, 19]]); code = ` print thumb([0 3 7 12 19]) print thumbUp([0 3 7 12 19]) print thumbDown([0 3 7 12 19]) print thumbUpDown([0 3 7 12 19])` expect(Mercury(code).parseTree.print).toStrictEqual([[0, 3, 0, 7, 0, 12, 0, 19], [0, 3, 0, 7, 0, 12, 0, 19], [0, 19, 0, 12, 0, 7, 0, 3], [0, 3, 0, 7, 0, 12, 0, 19, 0, 12, 0, 7]]); }); test('Utility List Methods', () => { let code = ` print add([1 2 3 4] [1 2 3]) print add([1 [2 3]] [10 [20 30 40]]) print subtract([1 2 3 4] [1 2 3]) print sub([1 [2 3]] [10 [20 30 40]]) print multiply([1 2 3 4] [1 2 3]) print mul([1 [2 3]] [10 [20 30 40]]) print divide([1 2 3 4] [1 2 3]) print div([1 [2 3]] [10 [20 30 40]]) print normalize([0 1 2 3 4]) print norm([5 [12 [4 17]] 3 1]) print snorm([5 [12 [4 17]] 3 1]) print mod([-2 [4 [3 7]]] 5) print int(spreadF(5 2 4)) print floor(spreadF(5 2 4)) print ceil(spreadF(5 2 4)) print round(spreadF(5 2 4)) ` expect(Mercury(code).parseTree.print).toStrictEqual([[2, 4, 6, 5], [11, [22, 33, 42]], [0, 0, 0, 3], [-9, [-18, -27, -38]], [1, 4, 9, 4], [10, [40, 90, 80]], [1, 1, 1, 4], [0.1, [0.1, 0.1, 0.05]], [0, 0.25, 0.5, 0.75, 1], [0.25, [0.6875, [0.1875, 1]], 0.125, 0], [-0.5, [0.375, [-0.625, 1]], -0.75, -1], [3, [4, [3, 2]]], [2, 2, 2, 3, 3], [2, 2, 2, 3, 3], [2, 3, 3, 4, 4], [2, 2, 3, 3, 4]]); code = ` print sum([1 2 3 4 5]) print reduce([1 2 3 4 5]) print size(spread(5)) print euclid(8 size([1 2 3]))` expect(Mercury(code).parseTree.print).toStrictEqual([ 15, 15, 5, [1, 0, 0, 1, 0, 0, 1, 0] ]); code = ` print wrap(spread(7) 2 5) print clip(spread(7) 2 5) print fold(spread(7) 3 5) print map(spread(4) 0 5 10 20) ` expect(Mercury(code).parseTree.print).toStrictEqual([[3, 4, 2, 3, 4, 2, 3], [2, 2, 2, 3, 4, 5, 5], [4, 5, 4, 3, 4, 5, 4], [10, 12, 14, 16]]); code = ` print equals([0 2 3 4]) print equals([1 2 3 4] [1 20 30 4]) print eq([hat kick snare] [hatt kick snare]) print notEquals([1 2 3 4] [1 20 30 4]) print neq([hat kick snare] [hatt kick snare]) print greater([1 2 3 5] [1 20 30 4]) print gt([1 2 3 5] [1 20 30 4]) print greaterEquals([1 2 3 5] [1 20 30 4]) print gte([1 2 3 5] [1 20 30 4]) print less([1 2 3 5] [1 20 30 4]) print lt([1 2 3 5] [1 20 30 4]) print lessEquals([1 2 3 5] [1 20 30 4]) print lte([1 2 3 5] [1 20 30 4]) ` expect(Mercury(code).parseTree.print).toStrictEqual([[1, 0, 0, 0], [1, 0, 0, 1], [0, 1, 1], [0, 1, 1, 0], [1, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0]]); }); test('Translate List Methods', () => { code = ` print midiToNote([60 63 67 69]) print noteToMidi([c4 eb4 g4 a4]) print freqToMidi([ 261 311 391 440 ]) print freqToNote([ 261 311 391 440 ]) print relativeToMidi([-12 -5 0 4 2 9] c4)` expect(Mercury(code).parseTree.print).toStrictEqual([['c4', 'eb4', 'g4', 'a4'], [60, 63, 67, 69], [60, 63, 67, 69], ['c4', 'eb4', 'g4', 'a4'], [48, 55, 60, 64, 62, 69]]); code = ` print int(midiToFreq([60 63 67 69])) print int(noteToFreq([c4 eb4 g4 a4])) print int(freqToMidi([ 261 311 391 440 ] true)) print int(relativeToFreq([-12 -5 0 4 2 9] c4)) print int(ratioToCent([2/1 3/2 4/3 5/4 9/8])) ` expect(Mercury(code).parseTree.print).toStrictEqual([[261, 311, 391, 440],[261, 311, 391, 440],[59, 62, 66, 69],[130, 195, 261, 329, 293, 440], [ 1200, 701, 498, 386, 203 ]]); code = ` print chromaToRelative([c eb G Ab a+ f-]) print chordsFromNumerals([I IIm IVsus2 V7 VIm9]) print chordsFromNames([C Dm Fsus2 G7 Am9])` expect(Mercury(code).parseTree.print).toStrictEqual([[0, 3, 7, 8, 21, -7], [[0, 4, 7], [2, 5, 9], [5, 7, 0], [7, 11, 2, 5], [9, 0, 4, 7, 11]], [[0, 4, 7], [2, 5, 9], [5, 7, 0], [7, 11, 2, 5], [9, 0, 4, 7, 11]]]); expect(Mercury(`set scale minor d`).parseTree.global.scale).toStrictEqual(['minor', 'd']); expect(Mercury(`print scaleNames()`).parseTree.print[0]).toHaveLength(93); code = ` set scale minor a set root c print getScale() print getRoot() print getScaleMap() print toScale([0 1 2 3 4 5 6 7 8 9 10 11]) print toScale([8 13 -1 20 -6 21 -4 12]) print int(toScale([0 4.1 6.5 7.1 9.25])) print toScale([0 1 2 3 4 5 6 7 8 9 10 11] major) print toScale([0 1 2 3 4 5 6 7 8 9 10 11] minor eb) ` expect(Mercury(code).parseTree.print).toStrictEqual([ 'minor', 'c', [0, 0, 2, 3, 3, 5, 5, 7, 8, 8, 10, 10], [0, 0, 2, 3, 3, 5, 5, 7, 8, 8, 10, 10], [8, 12, -2, 20, -7, 20, -4, 12], [0, 3, 5, 7, 8], [ 0, 0, 2, 2, 4, 5, 5, 7, 7, 9, 9, 11 ], [ 3, 3, 5, 6, 6, 8, 8, 10, 11, 11, 13, 13 ]]); code = ` set tempo 120 print getTempo() print divisionToRatio([1/4 1/8 3/16 1/4 2]) print ratioToMs([0.25 [0.125 [0.1875 0.25]] 2]) print ratioToMs([0.25 [0.125 [0.1875 0.25]] 2] 100)` expect(Mercury(code).parseTree.print).toStrictEqual([120, [0.25, 0.125, 0.1875, 0.25, 2], [500, [250, [375, 500]], 4000], [600, [300, [450, 600]], 4800]]); code = ` print textCode(bach) print textCode('bach cage') print textCode([bach cage])` expect(Mercury(code).parseTree.print).toStrictEqual([ [ 98, 97, 99, 104 ], [ 98, 97, 99, 104, 32, 99, 97, 103, 101 ], [[ 98, 97, 99, 104], [99, 97, 103, 101]] ]); });