UNPKG

nadesiko3

Version:
148 lines (146 loc) 8.55 kB
/* eslint-disable no-undef */ import assert from 'assert' import { NakoCompiler } from '../src/nako3.mjs' describe('array_test', async () => { const cmp = async (/** @type {string} */code, /** @type {string} */res) => { const nako = new NakoCompiler() nako.getLogger().debug('code=' + code) assert.strictEqual((await nako.runAsync(code, 'main.nako3')).log, res) } // --- test --- it('配列の基本テスト', async () => { await cmp('A=[0,1,2];A[0]を表示', '0') await cmp('A=[0,1,2];A@1を表示', '1') }) it('二次元配列の参照 A[1][1]', async () => { await cmp('A=[[0,1,2],[3,4,5]];A[1][1]を表示', '4') }) it('二次元配列の参照 A@1,1 #976 #1000', async () => { await cmp('A=[[0,1,2],[3,4,5]];A@1,1を表示', '4') }) it('二次元配列@の参照 #976', async () => { await cmp('A=[[0,1,2],[3,4,5]];A@1@1を表示', '4') await cmp('A=[[0,1,2],[3,4,5]];A@1,1を表示', '4') await cmp('A=[[0,1,2],[3,4,5]];N,M=[1,1];A@N,Mを表示', '4') }) it('二次元配列の代入 #976', async () => { await cmp('A=[[0,1,2],[3,4,5]];A[1][1]=100;A[1][1]を表示', '100') await cmp('A=[[0,1,2],[3,4,5]];N=1;M=1;A@N,M=100;A@N,Mを表示', '100') await cmp('A=[[0,1,2],[3,4,5]];A[1][1]を表示', '4') }) it('三次元配列の参照', async () => { await cmp('A=[[[1,2],[3,4]],[[5,6],[7,8]]]; A[1][1][1]を表示', '8') await cmp('A=[[[1,2],[3,4]],[[5,6],[7,8]]]; A[1, 1, 1]を表示', '8') await cmp('A=[[[1,2],[3,4]],[[5,6],[7,8]]]; A@1,1,1を表示', '8') }) it('要素から配列を記述する際に明示的な()が必要になる不具合 #1000', async () => { await cmp('Aは[0,1,2];Bは[A[1], A[1], A[2]];B[1]を表示', '1') }) it('配列を「代入」文するとエラーが出る問題 (nadesiko3 #1354)(core #75)', async () => { await cmp('Aは[];1に2を足して、A[0]に代入。A[0]を表示。', '3') }) it('配列連番作成 #1361 (core #78)', async () => { await cmp('1から3まで配列連番作成してJSONエンコードして表示', '[1,2,3]') await cmp('5から7まで配列連番作成してJSONエンコードして表示', '[5,6,7]') }) it('配列関数適用 #1361 (core #78)', async () => { await cmp('●(Nを)二倍処理とは;それはN*2;ここまで;A=[1,2,3];Aに「二倍処理」を配列関数適用してJSONエンコードして表示。', '[2,4,6]') await cmp('A=[1,2,3];Aへ配列関数適用には(N)\nそれはN*2;ここまで;それをJSONエンコードして表示。', '[2,4,6]') await cmp('●(Nを)二倍処理とは;それはN*2;ここまで;A=[1,2,3];Aに「二倍処理」を配列マップしてJSONエンコードして表示。', '[2,4,6]') }) it('配列フィルタ #1361 (core #78)', async () => { await cmp('●(Nを)偶数抽出とは;それは(N%2==0);ここまで;A=[1,2,3,4];Aを「偶数抽出」で配列フィルタしてJSONエンコードして表示。', '[2,4]') await cmp('●(Nを)偶数抽出とは;それは(N%2==0);ここまで;A=[1,2,3,4];Aについて「偶数抽出」で配列フィルタしてJSONエンコードして表示。', '[2,4]') await cmp('A=[1,2,3,4];Aについて配列フィルタには(N)\nそれは(N%2==0);ここまで;それをJSONエンコードして表示。', '[2,4]') }) it('配列プッシュ #1361 (core #78)', async () => { await cmp('Aは[];Aに3を配列プッシュ。AをJSONエンコードして表示。', '[3]') await cmp('Aは[1];Aに3を配列プッシュ。AをJSONエンコードして表示。', '[1,3]') }) it('配列要素作成 #1361 (core #78)', async () => { await cmp('100を3だけ配列要素作成してAに代入。AをJSONエンコードして表示。', '[100,100,100]') await cmp('1を5だけ配列要素作成してAに代入。AをJSONエンコードして表示。', '[1,1,1,1,1]') }) it('配列入替 #1374 (core #82)', async () => { await cmp('A=[0,1,2,3]。Aの0と2を配列入れ替え。AをJSONエンコードして表示。', '[2,1,0,3]') await cmp('A=[0,1,2,3]。Aの0と3を配列入れ替え。AをJSONエンコードして表示。', '[3,1,2,0]') await cmp('A=[0,1,2,3]。Aの0と4を配列入れ替え。AをJSONエンコードして表示。', '[null,1,2,3,0]') }) it('連続する配列と助詞の問題 #1627', async () => { await cmp('A=[[0,1],[2,3]]。A[1]と[2]を連続表示', '2,32') await cmp('A=[[0,1],[2,3]]。0にA[1]の[9,9]を配列一括挿入してJSONエンコードして表示', '[9,9,2,3]') }) it('配列記法の後ろの配列アクセスがエラー #1858 @', async () => { await cmp('[0,1,2,3,4,5]@2を表示', '2') await cmp('["a","b","c"]@2を表示', 'c') await cmp('[[0,1,2],[3,4,5]]@1,0を表示', '3') }) it('配列記法の後ろの配列アクセスがエラー #1858 []', async () => { await cmp('[0,1,2,3,4,5][2]を表示', '2') await cmp('["a","b","c"][2]を表示', 'c') await cmp('[[0,1,2],[3,4,5]][1,0]を表示', '3') }) it('オブジェクト記法の後ろの配列アクセスがエラー #1858 @', async () => { await cmp('{"a":1, "b":2}["b"]を表示', '2') await cmp('{"a":1, "b":2}@"b"を表示', '2') await cmp('[{"a":1, "b":2}]@0,"a"を表示', '1') }) it('括弧の後ろの配列アクセス #1985', async () => { await cmp('([1,2,3])@0を表示', '1') await cmp('([1,2,3])[2]を表示', '3') await cmp('A=[1,2,3];(A)@0を表示', '1') await cmp('A=[1,2,3];(A)[0]を表示', '1') }) it('JSONの後ろの配列アクセスは #1985 以前から可能だった!', async () => { await cmp('[1,2,3]@0を表示', '1') await cmp('[1,2,3][2]を表示', '3') await cmp('[1,2,{"犬":"わん"}][2]$犬を表示', 'わん') }) it('JSONの後ろの$(プロパティ)アクセス #1985', async () => { await cmp('{"犬": "わんわん"}$犬を表示', 'わんわん') await cmp('{"犬": "わんわん"}$"犬"を表示', 'わんわん') await cmp('{"犬": ["わんわん"]}$犬@0を表示', 'わんわん') await cmp('[{"犬": ["わんわん"]}]@0$犬@0を表示', 'わんわん') }) it('値の後ろの$(プロパティ)アクセス #1985', async () => { await cmp('({"犬": "わんわん"})$犬を表示', 'わんわん') await cmp('([{"犬": "わんわん"}])[0]$犬を表示', 'わんわん') await cmp('([{"犬": ["わんわん"]}])[0]$犬@0を表示', 'わんわん') }) it('配列+オブジェクトプロパティ #2139', async () => { await cmp('A=[{"b":10}]; A[0].b = 20; A[0].bを表示。', '20') }) it('二次元配列+オブジェクトプロパティ #2139', async () => { await cmp('A=[[{"b":10}],[{"b":20}]]; A[0][0].b = 88; A[0][0].bを表示。', '88') }) it('配列+オブジェクトプロパティ(DOM和スタイル適用) #2139', async () => { // __getProp/__setPropを使った例 await cmp(` FN_GET=JS実行(『(function(p){ p = (p == '犬') ? 'dog' : p; return this[p]; })』); FN_SET=JS実行(『(function(p, v){ p = (p == '犬') ? 'dog' : p; this[p]=v; })』); A={"dog": 30,"__setProp": FN_SET,"__getProp": FN_GET}; A$犬=200; A$dogを表示; `, '200') // __getProp/__setPropを使って1次元配列+オブジェクトプロパティをテスト await cmp(` FN_GET=JS実行(『(function(p){ p = (p == '犬') ? 'dog' : p; return this[p]; })』); FN_SET=JS実行(『(function(p, v){ p = (p == '犬') ? 'dog' : p; this[p]=v; })』); A=[{"dog": 30,"__setProp": FN_SET,"__getProp": FN_GET}]; A[0]$犬=200; A[0]$dogを表示; `, '200') // __getProp/__setPropを使って2次元配列+オブジェクトプロパティをテスト await cmp(` FN_GET=JS実行(『(function(p){ p = (p == '犬') ? 'dog' : p; return this[p]; })』); FN_SET=JS実行(『(function(p, v){ p = (p == '犬') ? 'dog' : p; this[p]=v; })』); A=[[{"dog": 30,"__setProp": FN_SET,"__getProp": FN_GET}]]; A[0][0]$犬=200; A[0][0]$dogを表示; `, '200') }) it('二次元配列+二次元オブジェクトプロパティ #2139', async () => { await cmp('A=[[{"b":10}],[{"b":20}]]; A[0][0]$b = {}; A[0][0]$b$c = 99; A[0][0]$b$cを表示。', '99') }) it('辞書@「{変数名}」に対応 #2103', async () => { await cmp('A={};A@"V1"=1;AをJSONエンコードして表示', '{"V1":1}') await cmp('A={};V=1;A@"V{V}"=1;AをJSONエンコードして表示', '{"V1":1}') }) })