UNPKG

skynovel

Version:
1,033 lines (974 loc) 29.8 kB
/* ***** BEGIN LICENSE BLOCK ***** Copyright (c) 2018-2020 Famibee (famibee.blog38.fc2.com) This software is released under the MIT License. http://opensource.org/licenses/mit-license.php ** ***** END LICENSE BLOCK ***** */ import assert = require('power-assert'); import {PropParser} from '../core/src/sn/PropParser'; import {IVariable, ISysBase, typeProcVal, ISetVal, IMark} from '../core/src/sn/CmnInterface'; class MyVal implements IVariable { private hGetVal = { "mp:fn" : "うひひ", "mp:lay" : "もきゅ", "mp:pos" : "うひひ", "ぎょへー" : "もきゅ", "春夏" : "秋冬", "から" : "", "ひきす" : "args", "hA.args" : "めけ", "hB.5" : "ニョホ", "hC.5reg" : "ニョホ2", "hC.args9" : "ニョホ3", "hA.秋冬.args" : "よいと", "hD.数値" : "1.20", "tmp:zero_n" : 0, "tmp:one_n" : 1, "tmp:zero_s" : "0", "tmp:one_s" : "1", "tmp:null_n" : null, "tmp:null_s" : "null", "sys:_album.img.渡り廊下・桜昼" : true, "、〇〰〽ぁヿ㐂一豈!¥" : true, // "true ? tmp:sys:zero_s" : "", // どうなる、どうすべき }; setSys(_sys: ISysBase): void {}; flush(): void {}; setDoRecProc(_doRecProc: (doRec: boolean)=> void): void {} getVal(arg_name: string): object {return this.hGetVal[arg_name];} setVal_Nochk = (_sc: string, _nm: string, _v: any, _ac?: boolean)=> {}; defTmp = (_name: string, _fnc: typeProcVal)=> {}; cloneMp = ()=> null; setMp = ()=> {}; setMark = (_place: number, mark: IMark)=> {}; getMark = (_place: number)=> null; cloneSave = ()=> null; mark2save(mark: IMark) {}; loadScrWork = (_fn: string)=> {}; getAreaKidoku = (_fn: string)=> null; saveKidoku(): void {}; defValTrg(_name: string, _fnc: ISetVal): void {}; doRecLog = ()=> false; }; context('class PropParser', ()=>{ let parser; beforeEach(()=> { parser = new PropParser(new MyVal); }); false ? describe('⏰ Time', ()=> { it('console.time', ()=> { for (let j=0; j<5; ++j) { console.time('PropParser.getValName'); // for (let i=0; i<10000; ++i) { const o = PropParser.getValName('hA["args"]["rrr"]'); // } console.timeEnd('PropParser.getValName'); } /* 一万回やらなくても傾向が見えるみたい PropParser.getValName: 0.408ms PropParser.getValName: 0.065ms PropParser.getValName: 0.017ms PropParser.getValName: 0.017ms PropParser.getValName: 0.016ms */ }); }) : describe('Tst', ()=> { // 数値計算 it('Num-bug20180618_0s', ()=> { // Error: (PropParser)不明な単語【 0】です assert.equal(parser.parse(" 0"), "0"); }); it('Num-bug20180618_1s', ()=> { // ok assert.equal(parser.parse(" 1"), "1"); }); it('Num-bug20180618_0', ()=> { // Error: (PropParser)不明な単語【 0】です assert.equal(parser.parse("0"), "0"); }); it('Num-bug20180618_1', ()=> { // ok assert.equal(parser.parse(" 1"), "1"); }); it('Num-bug20180618_0.0', ()=> { // ok assert.equal(parser.parse("0.0"), "0.0"); }); it('Num-bug20180618_1.0', ()=> { // ok assert.equal(parser.parse(" 1.0"), "1.0"); }); it('Num-bug20180618_null', ()=> { // ok assert.equal(parser.parse("null"), null); }); it('Num-1', ()=> { assert.equal(parser.parse("(1 + 2)"), "3"); }); it('Num0', ()=> { assert.equal(parser.parse("5 * (1 + 2)"), "15"); }); it('Num0.1', ()=> { assert.equal(parser.parse("5 * 1 + 2"), "7"); }); it('Num0.2', ()=> { assert.equal(parser.parse("1 + 2 * 5"), "11"); }); it('Num0.3', ()=> { assert.equal(parser.parse("5 ** (1 + 2)"), "125"); }); it('Num0.5', ()=> { assert.equal(parser.parse("0.5"), "0.5"); }); it('Num1', ()=> { assert.equal(parser.parse("1 * 4 > 2 && 3 % 2 == 1 ? 100 / 3 : 3") , "33.333333333333336"); }); it('Num2', ()=> { assert.equal(parser.parse("0xff"), "255"); }); it('Num3', ()=> { assert.equal(parser.parse("0xffffff"), "16777215"); }); it('Num4', ()=> { assert.equal(parser.parse("10 ¥ 4"), "2"); }); it('Num5', ()=> { assert.equal(parser.parse("10 / 4"), "2.5"); }); it('Num6', ()=> { assert.equal(parser.parse("11 % 4"), "3"); }); it('Num7_10', ()=> { assert.equal(parser.parse("14 & 9"), "8"); // Add // 1001 -- 9 // 1110 --14 // 1000 -- 8 }); it('Num7_11', ()=> { assert.equal(parser.parse("14 ^ 9"), "7"); // Add // 1001 -- 9 // 1110 --14 // 0111 -- 7 }); it('Num7_12', ()=> { assert.equal(parser.parse("14 | 9"), "15"); // Add // 1001 -- 9 // 1110 --14 // 1111 --15 }); it('Num7_13', ()=> { assert.equal(parser.parse("~ 9"), "-10"); // Add // 00001001 -- 9 // 11110110 -- -10 }); it('Num7_15', ()=> { assert.equal(parser.parse("9 << 2"), "36"); // Add // 00001001 -- 9 // 00100100 -- 36 }); it('Num7_16', ()=> { assert.equal(parser.parse("9 >> 2"), "2"); // Add // 00001001 -- 9 // 00000010 -- 2 }); it('Num7_16_', ()=> { assert.equal(parser.parse("-9 >> 2"), "-3"); // Add // 11110111 -- -9 // 11111101 -- -3 }); it('Num7_17', ()=> { assert.equal(parser.parse("9 >>> 2"), "2"); // Add // 00001001 -- 9 // 00000010 -- 2 }); it('Num7_17_', ()=> { assert.equal(parser.parse("-9 >>> 2"), "1073741821"); // Add // 11111111111111111111111111110111 -- -9 // 00111111111111111111111111111101 -- -3 }); it('Num20', ()=> { // 2018/07/12 assert.equal(parser.parse("-2"), "-2"); }); it('Num21', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("--2"), "2"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【--2】'); } }); it('Num22', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("+2"), "+2"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【+2】'); } }); it('Num25', ()=> { assert.equal(parser.parse("-2.3"), "-2.3"); }); it('Num26', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("--2.3"), "2.3"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【--2.3】'); } }); it('Num27', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("+2.3"), "+2.3"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【+2.3】'); } }); // 未使用 -> SKYNovelからサポート it('Num_int0', ()=> { assert.equal(parser.parse("int(10)"), "10"); }); it('Num_int1', ()=> { assert.equal(parser.parse("int(2.5)"), "2"); }); it('Num_int2', ()=> { assert.equal(parser.parse("int(10 / 4)"), "2"); }); it('Num_int2b', ()=> { try { parser.parse("int('10 / 4')"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)引数【10 / 4】が数値ではありません'); } }); it('Num_int2c', ()=> { assert.equal(parser.parse("parseInt('10 / 4')"), "2"); }); it('Num_Num2c', ()=> { assert.equal(parser.parse("Number('10 / 4')"), "2.5"); }); it('Num_int2d', ()=> { assert.equal(parser.parse("parseInt(10 / 4)"), "2"); }); it('Num_ceil', ()=> { assert.equal(parser.parse("ceil( 3.5)"), "4"); assert.equal(parser.parse("ceil(-3.5)"), "-3"); assert.equal(parser.parse("ceil(-3.5) "), "-3"); }); it('Num_floor', ()=> { assert.equal(parser.parse("floor( 3.5)"), "3"); assert.equal(parser.parse("floor(-3.5)"), "-4"); }); it('Num_round', ()=> { assert.equal(parser.parse("round( 3.5)"), "4"); assert.equal(parser.parse("round( 3.49)"), "3"); assert.equal(parser.parse("round(-3.5)"), "-3"); assert.equal(parser.parse("round(-3.51)"), "-4"); }); // 比較 it('Num10', ()=> { assert.equal(parser.parse("5 * (1 + 2)<14"), false); }); it('Num11', ()=> { assert.equal(parser.parse("5 * (1 + 2)<=14"), false); }); it('Num12', ()=> { assert.equal(parser.parse("5 * (1 + 2)==14"), false); }); it('Num12_', ()=> { assert.equal(parser.parse("5 * (1 + 2)!=14"), true); }); it('Num13', ()=> { assert.equal(parser.parse("5 * (1 + 2)>=14"), true); }); it('Num14', ()=> { assert.equal(parser.parse("5 * (1 + 2)>14"), true); }); it('Num20', ()=> { assert.equal(parser.parse("5 * (1 + 2)<15"), false); }); it('Num21', ()=> { assert.equal(parser.parse("5 * (1 + 2)<=15"), true); }); it('Num22', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15"), true); }); it('Num22_', ()=> { assert.equal(parser.parse("5 * (1 + 2)!=15"), false); }); it('Num23', ()=> { assert.equal(parser.parse("5 * (1 + 2)>=15"), true); }); it('Num24', ()=> { assert.equal(parser.parse("5 * (1 + 2)>15"), false); }); it('Num30', ()=> { assert.equal(parser.parse("5 * (1 + 2)<16"), true); }); it('Num31', ()=> { assert.equal(parser.parse("5 * (1 + 2)<=16"), true); }); it('Num32', ()=> { assert.equal(parser.parse("5 * (1 + 2)==16"), false); }); it('Num32_', ()=> { assert.equal(parser.parse("5 * (1 + 2)!=16"), true); }); it('Num33', ()=> { assert.equal(parser.parse("5 * (1 + 2)>=16"), false); }); it('Num34', ()=> { assert.equal(parser.parse("5 * (1 + 2)>16"), false); }); it('Num40', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 == true"), true); }); it('Num40_', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 != true"), false); }); it('Num41', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 == false"), false); }); it('Num41_', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 != false"), true); }); it('Num42', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 === true"), true); }); it('Num42_', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 !== true"), false); }); it('Num42_2', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 === 'true'"), false); }); it('Num43', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 === false"), false); }); it('Num43_', ()=> { assert.equal(parser.parse("5 * (1 + 2)==15 !== false"), true); }); it('Num50', ()=> { assert.equal(parser.parse("! false"), true); }); it('Num51', ()=> { assert.equal(parser.parse("! true"), false); }); it('Num52', ()=> { assert.equal(parser.parse("! (5 * (1 + 2)==15)"), false); }); it('Num53', ()=> { assert.equal(parser.parse("! (5 * (1 + 2)!=15)"), true); }); it('Num60 err', ()=> { try { parser.parse("4 : 10"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)三項演算子の文法エラーです。? が見つかりません'); } }); it('Num60_ err', ()=> { try { parser.parse("4 ? 10"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)三項演算子の文法エラーです。: が見つかりません'); } }); it('Num60_2 err', ()=> { try { assert.equal(parser.parse("true ? 10 = 2"), null); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【true ? 10 = 2】'); } }); it('Num60_3 err', ()=> { try { assert.equal(parser.parse("false ? 10 = 2"), null); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【false ? 10 = 2】'); } }); it('Num60_4 err', ()=> { try { assert.equal(parser.parse("4 ? 10 = 2"), null); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【4 ? 10 = 2】'); } }); it('Num61', ()=> { assert.equal(parser.parse("false ? 4 : 10"), 10); }); it('Num62', ()=> { assert.equal(parser.parse("true ? 4 : 10"), 4); }); it('Num63', ()=> { assert.equal(parser.parse("5 > 1 + 2 ? 4 : 10"), 4); }); it('Num64', ()=> { assert.equal(parser.parse("5 < 1 + 2 ? 4 : 10"), 10); }); it('Num65 err', ()=> { assert.equal(parser.parse("1 ? 4 : 10"), 4); }); it('Num66 err', ()=> { try { parser.parse("true ? 4"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)三項演算子の文法エラーです。: が見つかりません'); } }); it('Num67 err', ()=> { try { parser.parse("false : 10"); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)三項演算子の文法エラーです。? が見つかりません'); } }); // 変な文法 it('BadStr0', ()=> { try { parser.parse("@@").toString(); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【@@】'); } }); it('BadStr1', ()=> { try { parser.parse("").toString(); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【】'); } }); it('BadStr2', ()=> { try { parser.parse("(´ω⊂").toString(); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【(´ω⊂】'); // '(PropParser)不明な単語【´ω⊂】です'); } }); // 文字列 it('Str0', ()=> { assert.equal(parser.parse("'@@'"), "@@"); }); it('Str1', ()=> { assert.equal(parser.parse("''"), ""); }); it('Str2', ()=> { assert.equal(parser.parse("'(´ω⊂'"), "(´ω⊂"); }); it('Str3', ()=> { assert.equal(parser.parse('"(´Д⊂"'), "(´Д⊂"); }); it('Str4', ()=> { assert.equal(parser.parse("'0<5'"), "0<5"); }); it('Str5', ()=> { assert.equal(parser.parse("' @+@ '"), " @+@ "); }); it('Str6', ()=> { assert.equal(parser.parse("'@ + @'"), "@ + @"); }); it('Str7', ()=> { assert.equal(parser.parse("'いろは' + 'にほへ'"), "いろはにほへ"); }); it('Str7_2', ()=> { assert.equal(parser.parse("'いろは' + 55"), "いろは55"); }); it('Str7_3', ()=> { assert.equal(parser.parse("74 + 'にほへ'"), "74にほへ"); }); it('Str8', ()=> { // 2018/07/12 assert.equal(parser.parse("'05'"), "05"); }); it('Str9', ()=> { // 2018/07/12 assert.equal(parser.parse("' 05 '"), " 05 "); }); // 変数 it('Var0', ()=> { // からまーぞふ、は未定義リテラル assert.equal(parser.parse("からまーぞふ"), undefined); }); it('Var0_1', ()=> { // JavaScriptでは undefined == null。==がポイント assert.equal(parser.parse("からまーぞふ"), null); }); it('Var0_2', ()=> { assert.equal(parser.parse("tmp:null_n"), null); }); it('Var0_3', ()=> { assert.equal(parser.parse("tmp:null_s"), 'null'); }); it('Var1', ()=> { assert.equal(parser.parse("から"), ""); }); it('Var2', ()=> { assert.equal(parser.parse("'いろ' + 春夏 + 'は'"), "いろ秋冬は"); }); it('Var10', ()=> { assert.equal(parser.parse("mp:fn"), "うひひ"); }); it('Var10_1', ()=> { assert.equal(true, parser.parse("sys:_album.img.渡り廊下・桜昼")); }); it('Var10_2', ()=> { assert.equal(true, parser.parse("、〇〰〽ぁヿ㐂一豈!¥")); }); it('Var11', ()=> { assert.equal(parser.parse("mp:fn == mp:lay"), false); }); it('Var11_1', ()=> { assert.equal(parser.parse("mp:fn != mp:lay"), true); }); it('Var11_2', ()=> { assert.equal(parser.parse("!(mp:fn == mp:lay)"), true); }); it('Var11_3', ()=> { assert.equal(parser.parse("!(mp:fn != mp:lay)"), false); }); it('Var11_4', ()=> { assert.equal(parser.parse("!!(mp:fn == mp:lay)"), false); }); it('Var11_5', ()=> { assert.equal(parser.parse("!!(mp:fn != mp:lay)"), true); }); it('Var12', ()=> { assert.equal(parser.parse("mp:fn == mp:pos"), true); }); it('Var12_', ()=> { assert.equal(parser.parse("mp:fn != mp:pos"), false); }); it('Var12_2', ()=> { assert.equal(parser.parse("!(mp:fn == mp:pos)"), false); }); it('Var12_3', ()=> { assert.equal(parser.parse("!(mp:fn != mp:pos)"), true); }); it('Var12_4', ()=> { assert.equal(parser.parse("!!(mp:fn == mp:pos)"), true); }); it('Var12_5', ()=> { assert.equal(parser.parse("!!(mp:fn != mp:pos)"), false); }); it('Var13', ()=> { assert.equal(parser.parse("春夏"), "秋冬"); }); it('Var14', ()=> { assert.equal(parser.parse("春夏 == '秋冬'"), true); }); it('Var20', ()=> { assert.equal(parser.parse("ぎょへー"), "もきゅ"); }); it('Var21', ()=> { assert.equal(parser.parse("ぎょへー == mp:lay"), true); }); it('Var22', ()=> { assert.equal(parser.parse("ぎょへー == 'もきゅ'"), true); }); it('Var23', ()=> { assert.equal(parser.parse("ぎょへー != 'きゅ'"), true); }); it('Var30', ()=> { // うきょ、は未定義リテラル assert.equal(parser.parse("うきょ == null"), true); }); it('Var31', ()=> { assert.equal(parser.parse("うきょ != null"), false); }); it('Var32', ()=> { // assert.equal(parser.parse("うきょ === null"), true); assert.equal(parser.parse("うきょ === null"), false); // SKYNovelから }); it('Var33', ()=> { // assert.equal(parser.parse("うきょ !== null"), false); assert.equal(parser.parse("うきょ !== null"), true); // SKYNovelから }); it('Var35', ()=> { // うきょ、は未定義リテラル assert.equal(parser.parse("うきょ == 'null'"), false); }); it('Var36', ()=> { assert.equal(parser.parse("うきょ != 'null'"), true); }); it('Var37', ()=> { assert.equal(parser.parse("うきょ === 'null'"), false); }); it('Var38', ()=> { assert.equal(parser.parse("うきょ !== 'null'"), true); }); it('Var39', ()=> { // assert.equal(parser.parse("null == 'null'"), false); assert.equal(parser.parse("null == 'null'"), true); // SKYNovelから }); it('Var40', ()=> { assert.equal(parser.parse("null == tmp:null_n"), true); }); it('Var41', ()=> { assert.equal(parser.parse("tmp:null_n|0xF == 0xF"), true); }); it('Var42', ()=> { // assert.equal(parser.parse("null == tmp:null_s"), false); assert.equal(parser.parse("null == tmp:null_s"), true); // SKYNovelから }); it('Var43', ()=> { assert.equal(parser.parse("tmp:null_s|0xF == 0xF"), true); }); it('VarLogic01', ()=> { assert.equal(parser.parse("true"), true); }); it('VarLogic02', ()=> { assert.equal(parser.parse("false"), false); }); it('VarLogic03', ()=> { assert.equal(parser.parse("! false || false"), true); }); it('VarLogic04', ()=> { assert.equal(parser.parse("true &&(true)"), true); }); /* it('VarLogic05', ()=> { // assert.equal(parser.parse("true &&(true || false)"), true); assert.equal(parser.parse("true &&(true | false)"), true); // 独自不具合仕様か // (SKYNovel)意図がわからないのでテスト無効 }); */ it('VarLogic06', ()=> { assert.equal(parser.parse("true &&(!true || true)"), true); }); it('VarLogic07', ()=> { // assert.equal(parser.parse("true == 'true'"), false); // テストが間違ってる気がする // SKYNovelから assert.equal(parser.parse("true == 'true'"), true); }); it('VarLogic07_', ()=> { assert.equal(parser.parse("true === 'true'"), false); }); it('VarLogic08', ()=> { // assert.equal(parser.parse("false == 'false'"), false); // テストが間違ってる気がする // SKYNovelから assert.equal(parser.parse("false == 'false'"), true); }); it('VarLogic08_', ()=> { assert.equal(parser.parse("false === 'false'"), false); }); it('VarLogic10', ()=> { assert.equal(parser.parse("undefined"), undefined); }); it('VarLogic10_2', ()=> { // JavaScriptでは undefined == null。==がポイント assert.equal(parser.parse("undefined"), null); }); it('VarLogic10_3', ()=> { assert.equal(parser.parse("undefined == null"), true); }); it('VarLogic10_4', ()=> { // むきょー、は未定義リテラル assert.equal(parser.parse("むきょー == null"), true); }); it('VarLogic11', ()=> { assert.equal(parser.parse("! undefined"), true); }); it('VarLogic12', ()=> { assert.equal(parser.parse("null"), null); }); it('VarLogic13', ()=> { assert.equal(parser.parse("! null"), true); }); // 連想配列 it('Hash-2', ()=> { assert.equal(parser.parse("hA.秋冬.args"), "よいと"); }); it('Hash-1', ()=> { assert.equal(parser.parse("hA.args"), "めけ"); }); it('Hash0', ()=> { assert.equal(parser.parse("hA['args']"), "めけ"); }); it('Hash0b', ()=> { assert.equal(parser.parse('hA["args"]'), "めけ"); }); it('Hash1', ()=> { assert.equal(parser.parse("hA[ひきす]"), "めけ"); }); it('Hash2', ()=> { assert.equal(parser.parse("hB[1 + 4]"), "ニョホ"); }); it('Hash3', ()=> { assert.equal(parser.parse("hC[5 + 'reg']"), "ニョホ2"); }); it('Hash4', ()=> { assert.equal(parser.parse("hC['args'+ 9]"), "ニョホ3"); }); it('Hash5', ()=> { assert.equal(parser.parse("hC[ひきす + 9]"), "ニョホ3"); }); it('Hash6', ()=> { assert.equal(parser.parse("hA[春夏][ひきす]"), "よいと"); }); it('Hash7', ()=> { assert.equal(parser.parse("hA[春夏].args"), "よいと"); }); it('Hash8', ()=> { assert.equal(parser.parse("hA['秋冬']['args']"), "よいと"); }); it('Hash10_err', ()=> { assert.equal(parser.parse("hA['秋冬err']['args']"), undefined); }); it('Hash11_err', ()=> { assert.equal(parser.parse("hA['秋冬']['argsERR']"), undefined); }); it('Hash12_err', ()=> { assert.equal(parser.parse("hAerr['秋冬']['args']"), undefined); }); // 変数埋め込み it('EmbedPerl0', ()=> { assert.equal(parser.parse("'せを$春夏 はやみ'"), "せを秋冬 はやみ"); }); it('EmbedPerl1', ()=> { assert.equal(parser.parse("'せを$春夏'+'はやみ'"), "せを秋冬はやみ"); }); it('EmbedPerl2', ()=> { assert.equal(parser.parse("'せを$春夏$mp:pos'+'はや'"), "せを秋冬うひひはや"); }); it('EmbedPerl3', ()=> { assert.equal(parser.parse("'せ$hC.5reg は'"), "せニョホ2 は"); }); it('EmbedPerl4', ()=> { assert.equal(parser.parse("'$hD.数値'"), "1.20"); }); it('EmbedPerl5', ()=> { assert.equal(parser.parse("tmp:zero_s + tmp:one_s"), "01"); }); it('EmbedPerl6', ()=> { assert.equal(parser.parse("tmp:zero_s + tmp:one_n"), "01"); }); it('EmbedPerl7', ()=> { assert.equal(parser.parse("tmp:zero_n + tmp:one_s"), "01"); }); it('EmbedPerl8', ()=> { assert.equal(parser.parse("tmp:zero_n + tmp:one_n"), "1"); }); it('EmbedPerl10', ()=> { // 2018/07/12 加減算ではなく+−の正号・負号 assert.equal(parser.parse("-hD.数値"), -1.20); }); it('EmbedPerl11', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("+hD.数値"), 1.20); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)文法エラー【+hD.数値】'); } }); it('EmbedPerl12', ()=> { assert.equal(parser.parse("0-hD.数値"), -1.20); }); it('EmbedPerl13', ()=> { assert.equal(parser.parse("0+hD.数値"), 1.20); }); it('EmbedPerl14', ()=> { try { // むきょー、は未定義リテラル assert.equal(parser.parse("-むきょー"), 0); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)数値以外に-符号がついています'); } }); it('EmbedPerl15', ()=> { try { // まぁ文法エラーかなと assert.equal(parser.parse("-tmp:null_n"), null); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)数値以外に-符号がついています'); } }); it('EmbedPerl16', ()=> { try { assert.equal(parser.parse("-tmp:null_s"), NaN); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)数値以外に-符号がついています'); } }); it('EmbedPerl17', ()=> { assert.equal(parser.parse("!tmp:null_n"), true); }); it('EmbedPerl18', ()=> { try { assert.equal(parser.parse("-false"), -1.20); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)数値以外に-符号がついています'); } }); it('EmbedPerl19', ()=> { try { assert.equal(parser.parse("-true"), -1.20); assert.equal('fail', '起こるべき例外が起こっていない'); } catch (e) { assert.equal(e.message, '(PropParser)数値以外に-符号がついています'); } }); it('EmbedPer20', ()=> { assert.equal(parser.parse("'を$春夏,は'"), "を秋冬,は"); }); it('EmbedPer21', ()=> { assert.equal(parser.parse("'を$春夏{は'"), "を秋冬{は"); }); it('EmbedPer22', ()=> { assert.equal(parser.parse("'を$春夏}は'"), "を秋冬}は"); }); it('EmbedPer23', ()=> { assert.equal(parser.parse("'を$春夏[は'"), "を秋冬[は"); }); it('EmbedPer24', ()=> { assert.equal(parser.parse("'を$春夏]は'"), "を秋冬]は"); }); it('EmbedPer25', ()=> { assert.equal(parser.parse("'を$春夏(は'"), "を秋冬(は"); }); it('EmbedPer26', ()=> { assert.equal(parser.parse("'を$春夏)は'"), "を秋冬)は"); }); it('EmbedPer27', ()=> { assert.equal(parser.parse("'を$春夏<は'"), "を秋冬<は"); }); it('EmbedPer28', ()=> { assert.equal(parser.parse("'を$春夏>は'"), "を秋冬>は"); }); it('EmbedPer29', ()=> { assert.equal(parser.parse("'を$春夏/は'"), "を秋冬/は"); }); it('EmbedPer30', ()=> { assert.equal(parser.parse("'を$春夏\\は'"), "を秋冬\\は"); }); it('EmbedRuby0', ()=> { assert.equal(parser.parse("'せを#{春夏} はやみ'"), "せを秋冬 はやみ"); }); it('EmbedRuby1', ()=> { assert.equal(parser.parse("'せを#{春夏}'+'はやみ'"), "せを秋冬はやみ"); }); it('EmbedRuby2', ()=> { assert.equal(parser.parse("'せを#{春夏}はやみ'"), "せを秋冬はやみ"); }); it('EmbedRuby3', ()=> { assert.equal(parser.parse("'せを#{10 / 4}やみ'"), "せを2.5やみ"); // assert.equal(parser.parse("'せを#{10 / 4}やみ'"), "せをnullやみ"); }); it('EmbedPerlRuby0', ()=> { assert.equal(parser.parse("'せを$春夏$mp:pos#{hB.5}は'"), "せを秋冬うひひニョホは"); }); it('_getValName0', ()=> { const o = PropParser.getValName('mp:fn'); assert.equal(o['scope'], 'mp'); assert.equal(o['name'], 'fn'); assert.equal(o['at'], ''); }); it('_getValName1', ()=> { const o = PropParser.getValName('fn'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'fn'); assert.equal(o['at'], ''); }); it('_getValName2', ()=> { const o = PropParser.getValName('ぎょへー'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'ぎょへー'); assert.equal(o['at'], ''); }); it('_getValName3', ()=> { const o = PropParser.getValName('hC.5reg'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'hC.5reg'); assert.equal(o['at'], ''); }); it('_getValName4', ()=> { const o = PropParser.getValName('hA.秋冬.args'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'hA.秋冬.args'); assert.equal(o['at'], ''); }); it('_getValName5', ()=> { const o = PropParser.getValName('sys:_album.img.渡り廊下・桜昼'); assert.equal(o['scope'], 'sys'); assert.equal(o['name'], '_album.img.渡り廊下・桜昼'); assert.equal(o['at'], ''); }); it('_getValName10', ()=> { const o = PropParser.getValName("hA['args']"); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'hA.args'); assert.equal(o['at'], ''); }); it('_getValName11', ()=> { const o = PropParser.getValName('hA["args"]'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'hA.args'); assert.equal(o['at'], ''); }); it('_getValName12', ()=> { const o = PropParser.getValName('hA["args"]["rrr"]'); assert.equal(o['scope'], 'tmp'); assert.equal(o['name'], 'hA.args.rrr'); assert.equal(o['at'], ''); }); // 不具合 it('Var170109_0', ()=> { assert.equal(parser.parse("true && ( 1080 > 1440 || 1920 > 2560 )"), false); assert.equal(parser.parse("true && ( false || false )"), false); assert.equal(parser.parse("( false || false )"), false); }); // あとで直す it('Var170109_1', ()=> { assert.equal(parser.parse("true && ( 1441 > 1440 || 1920 > 2560 )"), true); assert.equal(parser.parse("true && ( true || false )"), true); assert.equal(parser.parse("( true || false )"), true); // Error: No match for ) }); it('_getValName_err0', ()=> { const o = PropParser.getValName('mp:f:n'); assert.equal(o, null); }); }); });