nadesiko3
Version:
Japanese Programming Language
148 lines (146 loc) • 8.55 kB
JavaScript
/* 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}')
})
})