diff --git a/packages/eval/evaluate.mjs b/packages/eval/evaluate.mjs index 3db93b6d..b5cb851b 100644 --- a/packages/eval/evaluate.mjs +++ b/packages/eval/evaluate.mjs @@ -11,6 +11,7 @@ const { isPattern, Pattern } = strudel; export const extend = (...args) => { console.warn('@strudel.cycles/eval extend is deprecated, please use evalScope instead'); + console.log('extend', args); Object.assign(globalThis, ...args); }; diff --git a/packages/eval/vitest/evaluate.test.mjs b/packages/eval/vitest/evaluate.test.mjs new file mode 100644 index 00000000..c192becd --- /dev/null +++ b/packages/eval/vitest/evaluate.test.mjs @@ -0,0 +1,37 @@ +/* +evaluate.test.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { describe, it, expect } from 'vitest'; + +import { evaluate, extend, evalScope } from '../evaluate.mjs'; +import { mini } from '@strudel.cycles/mini'; +import * as strudel from '@strudel.cycles/core'; + +const { fastcat, cat, slowcat, reify } = strudel; + +extend({ mini, cat, fastcat, slowcat, reify }); +// extend({ mini }, strudel); // TODO: this is not working +// TODO: test evalScope +// evalScope({ mini }, strudel); + +describe('evaluate', () => { + const ev = async (code) => (await evaluate(code)).pattern._firstCycleValues; + it('Should evaluate strudel functions', async () => { + expect(await ev('pure("c3")')).toEqual(['c3']); + expect(await ev('cat("c3")')).toEqual(['c3']); + expect(await ev('fastcat("c3", "d3")')).toEqual(['c3', 'd3']); + expect(await ev('slowcat("c3", "d3")')).toEqual(['c3']); + }); + it('Should be extendable', async () => { + extend({ myFunction: (...x) => fastcat(...x) }); + expect(await ev('myFunction("c3", "d3")')).toEqual(['c3', 'd3']); + }); + it('Should evaluate simple double quoted mini notation', async () => { + expect(await ev('"c3"')).toEqual(['c3']); + expect(await ev('"c3 d3"')).toEqual(['c3', 'd3']); + expect(await ev('""')).toEqual(['c3']); + }); +}); diff --git a/packages/eval/vitest/shapeshifter.test.mjs b/packages/eval/vitest/shapeshifter.test.mjs new file mode 100644 index 00000000..39d9d715 --- /dev/null +++ b/packages/eval/vitest/shapeshifter.test.mjs @@ -0,0 +1,19 @@ +/* +shapeshifter.test.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { describe, it, expect } from 'vitest'; +import shapeshifter from '../shapeshifter.mjs'; + +describe('shapeshifter', () => { + it('Should shift simple double quote string', () => { + expect(shapeshifter('"c3"')).toEqual('(async()=>{return mini("c3").withMiniLocation([1,0,15],[1,4,19])})()'); + }); + it('Should handle dynamic imports', () => { + expect(shapeshifter('const { default: foo } = await import(\'https://bar.com/foo.js\');"c3"')).toEqual( + '(async()=>{const{default:foo}=await import("https://bar.com/foo.js");return mini("c3").withMiniLocation([1,64,79],[1,68,83])})()', + ); + }); +}); diff --git a/packages/mini/vitest/mini.test.mjs b/packages/mini/vitest/mini.test.mjs new file mode 100644 index 00000000..88de3cee --- /dev/null +++ b/packages/mini/vitest/mini.test.mjs @@ -0,0 +1,53 @@ +/* +mini.test.mjs - +Copyright (C) 2022 Strudel contributors - see +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . +*/ + +import { mini } from '../mini.mjs'; +import '@strudel.cycles/core/euclid.mjs'; +import { describe, it, expect } from 'vitest'; + +describe('mini', () => { + const minV = (v) => mini(v)._firstCycleValues; + const minS = (v) => mini(v)._showFirstCycle; + it('supports single elements', () => { + expect(minV('a')).toEqual(['a']); + }); + it('supports rest', () => { + expect(minV('~')).toEqual([]); + }); + it('supports cat', () => { + expect(minS('a b')).toEqual(['a: 0 - 1/2', 'b: 1/2 - 1']); + expect(minS('a b c')).toEqual(['a: 0 - 1/3', 'b: 1/3 - 2/3', 'c: 2/3 - 1']); + }); + it('supports slowcat', () => { + expect(minV('')).toEqual(['a']); + }); + it('supports division', () => { + expect(minS('a/2')).toEqual(['a: 0 - 2']); + expect(minS('[c3 d3]/2')).toEqual(['c3: 0 - 1']); + }); + it('supports multiplication', () => { + expect(minS('c3*2')).toEqual(['c3: 0 - 1/2', 'c3: 1/2 - 1']); + expect(minV('[c3 d3]*2')).toEqual(['c3', 'd3', 'c3', 'd3']); + }); + it('supports brackets', () => { + expect(minS('c3 [d3 e3]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 1']); + expect(minS('c3 [d3 [e3 f3]]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 7/8', 'f3: 7/8 - 1']); + }); + it('supports commas', () => { + expect(minS('c3,e3,g3')).toEqual(['c3: 0 - 1', 'e3: 0 - 1', 'g3: 0 - 1']); + expect(minS('[c3,e3,g3] f3')).toEqual(['c3: 0 - 1/2', 'e3: 0 - 1/2', 'g3: 0 - 1/2', 'f3: 1/2 - 1']); + }); + it('supports elongation', () => { + expect(minS('a@3 b')).toEqual(['a: 0 - 3/4', 'b: 3/4 - 1']); + expect(minS('a@2 b@3')).toEqual(['a: 0 - 2/5', 'b: 2/5 - 1']); + }); + it('supports replication', () => { + expect(minS('a!3 b')).toEqual(['a: 0 - 1/4', 'a: 1/4 - 1/2', 'a: 1/2 - 3/4', 'b: 3/4 - 1']); + }); + it('supports euclidean rhythms', () => { + expect(minS('a(3, 8)')).toEqual(['a: 0 - 1/8', 'a: 3/8 - 1/2', 'a: 3/4 - 7/8']); + }); +});