nadesiko3 3.3.48 → 3.3.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/core/.editorconfig +6 -0
  2. package/core/.eslintrc.cjs +33 -0
  3. package/core/.github/dependabot.yml +7 -0
  4. package/core/.github/workflows/nodejs.yml +37 -0
  5. package/core/.github/workflows/super-linter.yml +61 -0
  6. package/core/.github/workflows/textlint.yml +199 -0
  7. package/core/LICENSE +21 -0
  8. package/core/README.md +66 -0
  9. package/core/batch/build_nako_version.nako3 +42 -0
  10. package/core/command/snako.mjs +105 -0
  11. package/core/command/snako.mts +116 -0
  12. package/core/index.mjs +21 -0
  13. package/core/index.mts +21 -0
  14. package/core/package.json +47 -0
  15. package/core/sample/hello.nako3 +7 -0
  16. package/core/sample/hoge.mjs +4 -0
  17. package/core/sample/hoge.mts +6 -0
  18. package/core/src/nako3.mjs +858 -0
  19. package/core/src/nako3.mts +967 -0
  20. package/core/src/nako_colors.mjs +78 -0
  21. package/core/src/nako_colors.mts +86 -0
  22. package/core/src/nako_core_version.mjs +8 -0
  23. package/core/src/nako_core_version.mts +19 -0
  24. package/core/src/nako_csv.mjs +185 -0
  25. package/core/src/nako_csv.mts +188 -0
  26. package/core/src/nako_errors.mjs +173 -0
  27. package/core/src/nako_errors.mts +197 -0
  28. package/core/src/nako_from_dncl.mjs +255 -0
  29. package/core/src/nako_from_dncl.mts +250 -0
  30. package/core/src/nako_gen.mjs +1648 -0
  31. package/core/src/nako_gen.mts +1719 -0
  32. package/core/src/nako_gen_async.mjs +1659 -0
  33. package/core/src/nako_gen_async.mts +1732 -0
  34. package/core/src/nako_global.mjs +107 -0
  35. package/core/src/nako_global.mts +138 -0
  36. package/core/src/nako_indent.mjs +445 -0
  37. package/core/src/nako_indent.mts +492 -0
  38. package/core/src/nako_josi_list.mjs +38 -0
  39. package/core/src/nako_josi_list.mts +45 -0
  40. package/core/src/nako_lex_rules.mjs +253 -0
  41. package/core/src/nako_lex_rules.mts +260 -0
  42. package/core/src/nako_lexer.mjs +609 -0
  43. package/core/src/nako_lexer.mts +612 -0
  44. package/core/src/nako_logger.mjs +199 -0
  45. package/core/src/nako_logger.mts +232 -0
  46. package/core/src/nako_parser3.mjs +2439 -0
  47. package/core/src/nako_parser3.mts +2195 -0
  48. package/core/src/nako_parser_base.mjs +370 -0
  49. package/core/src/nako_parser_base.mts +370 -0
  50. package/core/src/nako_parser_const.mjs +37 -0
  51. package/core/src/nako_parser_const.mts +37 -0
  52. package/core/src/nako_prepare.mjs +304 -0
  53. package/core/src/nako_prepare.mts +315 -0
  54. package/core/src/nako_reserved_words.mjs +38 -0
  55. package/core/src/nako_reserved_words.mts +38 -0
  56. package/core/src/nako_source_mapping.mjs +207 -0
  57. package/core/src/nako_source_mapping.mts +262 -0
  58. package/core/src/nako_test.mjs +37 -0
  59. package/core/src/nako_types.mjs +25 -0
  60. package/core/src/nako_types.mts +151 -0
  61. package/core/src/plugin_csv.mjs +49 -0
  62. package/core/src/plugin_csv.mts +50 -0
  63. package/core/src/plugin_math.mjs +328 -0
  64. package/core/src/plugin_math.mts +326 -0
  65. package/core/src/plugin_promise.mjs +91 -0
  66. package/core/src/plugin_promise.mts +91 -0
  67. package/core/src/plugin_system.mjs +2832 -0
  68. package/core/src/plugin_system.mts +2690 -0
  69. package/core/src/plugin_test.mjs +34 -0
  70. package/core/src/plugin_test.mts +34 -0
  71. package/core/test/array_test.mjs +34 -0
  72. package/core/test/basic_test.mjs +344 -0
  73. package/core/test/calc_test.mjs +140 -0
  74. package/core/test/core_module_test.mjs +23 -0
  75. package/core/test/debug_test.mjs +16 -0
  76. package/core/test/dncl_test.mjs +94 -0
  77. package/core/test/error_message_test.mjs +210 -0
  78. package/core/test/error_test.mjs +16 -0
  79. package/core/test/flow_test.mjs +373 -0
  80. package/core/test/func_call.mjs +160 -0
  81. package/core/test/func_test.mjs +149 -0
  82. package/core/test/indent_test.mjs +364 -0
  83. package/core/test/lex_test.mjs +168 -0
  84. package/core/test/literal_test.mjs +73 -0
  85. package/core/test/nako_lexer_test.mjs +35 -0
  86. package/core/test/nako_logger_test.mjs +76 -0
  87. package/core/test/nako_logger_test.mts +78 -0
  88. package/core/test/plugin_csv_test.mjs +38 -0
  89. package/core/test/plugin_promise_test.mjs +18 -0
  90. package/core/test/plugin_system_test.mjs +630 -0
  91. package/core/test/prepare_test.mjs +96 -0
  92. package/core/test/re_test.mjs +22 -0
  93. package/core/test/side_effects_test.mjs +92 -0
  94. package/core/test/variable_scope_test.mjs +149 -0
  95. package/core/tsconfig.json +101 -0
  96. package/package.json +4 -2
  97. package/release/_hash.txt +12 -12
  98. package/release/_script-tags.txt +14 -14
  99. package/release/editor.js +1 -1
  100. package/release/stats.json +1 -1
  101. package/release/version.js +1 -1
  102. package/release/wnako3.js +1 -1
  103. package/src/nako_version.mjs +2 -2
  104. package/src/nako_version.mts +2 -2
  105. package/test/async/async_basic_test.mjs +3 -3
@@ -0,0 +1,73 @@
1
+ import assert from 'assert'
2
+ import { NakoCompiler } from '../src/nako3.mjs'
3
+
4
+ describe('literal_test', async () => {
5
+ const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
6
+ const nako = new NakoCompiler()
7
+ nako.logger.debug('code=' + code)
8
+ assert.strictEqual((await nako.runAsync(code)).log, res)
9
+ }
10
+ const err = async (/** @type {string} */ code) => {
11
+ const nako = new NakoCompiler()
12
+ nako.logger.debug('code=' + code)
13
+ try {
14
+ await nako.runAsync(code)
15
+ } catch (error) {
16
+ assert.ok(error)
17
+ return
18
+ }
19
+ assert.fail()
20
+ }
21
+ // --- test ---
22
+ it('非数', async () => {
23
+ await cmp('0/0を表示', 'NaN')
24
+ await cmp('非数を表示', 'NaN')
25
+ })
26
+ it('無限大', async () => {
27
+ await cmp('3/無限大を表示', '0')
28
+ })
29
+ describe('十進法のテスト', async () => {
30
+ // 基本的に(整数部)(小数部)(指数部)です
31
+ it('0', async () => {
32
+ await cmp('0の変数型確認して表示', 'number')
33
+ await cmp('013+014を表示', '27') // javascriptとは違い0から始まる7以下の数字だけで構成される数は八進数ではなく十進数として解釈されます
34
+ })
35
+ it('小数点', async () => {
36
+ await cmp('.11の変数型確認して表示', 'number') // 小数点から始まっても数として解釈
37
+ await cmp('222.の変数型確認して表示', 'number') // 逆に小数点で終わっても数として解釈
38
+ err('123.$の変数型確認して表示') // しかしドットの後に定義されていない文字列をくっつけるとエラー
39
+ })
40
+ it('指数表記', async () => {
41
+ await cmp('7e+8=7e8を表示', 'true') // 指数表記の+は省略可能
42
+ await cmp('7.5e8の変数型確認して表示', 'number') // 小数と組み合わせることもできる
43
+ await cmp('7.e8の変数型確認して表示', 'number') // もちろん小数部を省略しても数として解釈
44
+ })
45
+ })
46
+ it('十六進法のテスト', async () => {
47
+ await cmp('0x1dfの変数型確認して表示', 'number')
48
+ })
49
+ it('八進法のテスト', async () => {
50
+ await cmp('0o157の変数型確認して表示', 'number')
51
+ })
52
+ it('二進法のテスト', async () => {
53
+ await cmp('0b101の変数型確認して表示', 'number')
54
+ })
55
+ it('数値区切文字', async () => {
56
+ await cmp('12345_00=123_4500を表示', 'true') // 区切り文字として「_」が使用できます
57
+ await cmp('12345_00=1_23_4500を表示', 'true') // 数字の中でのどこでも使用できます
58
+ err('1____23_4500を表示') // 連続して使うことはできません
59
+ await cmp('_123を表示', 'undefined') // 区切り文字で始めることはできません(定義されていない変数「_123」の参照)
60
+ err('123_を表示') // 区切り文字で終わらせることはできません
61
+ await cmp('0xCAFE_F00Dの変数型確認して表示', 'number') // 十六進数でも
62
+ await cmp('0o123456_777の変数型確認して表示', 'number') // 八進数でも
63
+ await cmp('0b1111_0000の変数型確認して表示', 'number') // 二進数でも
64
+ await cmp('101_475_938.322_8の変数型確認して表示', 'number') // 小数でも
65
+ err('3_.1415の変数型確認して表示') // 小数点等の標識の前後では区切り文字は使えません
66
+ err('3e_1415の変数型確認して表示')
67
+ })
68
+ it('単位のテスト #994', async () => {
69
+ await cmp('30kgを表示', '30')
70
+ await cmp('A=100円;Aを表示', '100')
71
+ await cmp('B=300㎡;B=B+1㎡;Bを表示', '301')
72
+ })
73
+ })
@@ -0,0 +1,35 @@
1
+ import assert from 'assert'
2
+ import { NakoLexer } from '../src/nako_lexer.mjs'
3
+ import { NakoLogger } from '../src/nako_logger.mjs'
4
+ import { NakoPrepare } from '../src/nako_prepare.mjs'
5
+
6
+ describe('nako_lexer_test', () => {
7
+ const lex = new NakoLexer(new NakoLogger())
8
+ const pre = NakoPrepare.getInstance()
9
+ // --- test ---
10
+ it('トークンの区切りテスト', () => {
11
+ const a = lex.tokenize('Nは30', 0, 'test.nako3')
12
+ assert.strictEqual(NakoLexer.tokensToTypeStr(a, '|'), 'word|number')
13
+ const b = lex.tokenize('もしN=30ならば', 0, 'test.nako3')
14
+ assert.strictEqual(NakoLexer.tokensToTypeStr(b, '|'), 'もし|word|eq|number')
15
+ })
16
+ it('関数の登録テスト', () => {
17
+ const code = '●AAAとは\n「あ」を表示\nここまで。\n'
18
+ const code2 = pre.convert(code).map((v) => v.text).join('')
19
+ const tok = lex.tokenize(code2, 0, 'test.nako3')
20
+ /** @type {any} */
21
+ const funclist = {}
22
+ // @ts-ignore
23
+ NakoLexer.preDefineFunc(tok, lex.logger, funclist)
24
+ assert.strictEqual(funclist.test__AAA.type, 'func')
25
+ })
26
+ it('変数は登録しないというテスト', () => {
27
+ const code = 'HOGE=333\n'
28
+ const code2 = pre.convert(code).map((v) => v.text).join('')
29
+ const tok = lex.tokenize(code2, 0, 'test.nako3')
30
+ /** @type {any} */
31
+ const funclist = {}
32
+ NakoLexer.preDefineFunc(tok, lex.logger, funclist)
33
+ assert.strictEqual(funclist.HOGE, undefined)
34
+ })
35
+ })
@@ -0,0 +1,76 @@
1
+ import assert from 'assert';
2
+ import { NakoColors } from '../src/nako_colors.mjs';
3
+ import { NakoLogger } from '../src/nako_logger.mjs';
4
+ describe('nako_logger_test', () => {
5
+ it('色付けのテスト', () => {
6
+ const out = NakoColors.convertColorTextFormat(`デフォルト${NakoColors.color.bold}太字${NakoColors.color.red}太字赤${NakoColors.color.reset}デフォルト<script>`);
7
+ assert.strictEqual(out.noColor, 'デフォルト太字太字赤デフォルト<script>');
8
+ assert.strictEqual(out.nodeConsole, 'デフォルト\u001b[1m太字\u001b[31m太字赤\u001b[0mデフォルト<script>\u001b[0m');
9
+ assert.strictEqual(out.html, '<span>デフォルト</span><span style="color: inherit; font-weight: bold;">太字</span><span style="color: red; font-weight: bold;">太字赤</span><span style="color: inherit; font-weight: inherit;">デフォルト&lt;script&gt;</span>');
10
+ assert.deepStrictEqual(out.browserConsole, [
11
+ 'デフォルト%c太字%c太字赤%cデフォルト<script>',
12
+ 'color: inherit; font-weight: bold;',
13
+ 'color: red; font-weight: bold;',
14
+ 'color: inherit; font-weight: inherit;'
15
+ ]);
16
+ });
17
+ it('ログの取得のテスト', (done) => {
18
+ const logger = new NakoLogger();
19
+ logger.addListener('info', (data) => {
20
+ assert.strictEqual(data.noColor, '[情報]main.nako3(2行目): foo');
21
+ done();
22
+ });
23
+ logger.info('foo', {
24
+ startOffset: 0,
25
+ endOffset: 0,
26
+ line: 1,
27
+ file: 'main.nako3'
28
+ });
29
+ });
30
+ it('複数のリスナーのテスト1', () => {
31
+ const logger = new NakoLogger();
32
+ let logStr = '';
33
+ logger.addListener('info', (data) => { logStr += 'i'; });
34
+ logger.addListener('error', (data) => { logStr += 'e'; });
35
+ logger.addListener('stdout', (data) => { logStr += 's'; });
36
+ logger.error('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' });
37
+ assert.strictEqual(logStr, 'ie');
38
+ });
39
+ it('複数リスナーのテスト2', () => {
40
+ const logger = new NakoLogger();
41
+ let logStr = '';
42
+ logger.addListener('info', (data) => { logStr += 'i'; });
43
+ logger.addListener('error', (data) => { logStr += 'e'; });
44
+ logger.addListener('stdout', (data) => { logStr += 's'; });
45
+ logger.info('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' });
46
+ assert.strictEqual(logStr, 'i');
47
+ });
48
+ it('複数リスナーのテスト3', () => {
49
+ const logger = new NakoLogger();
50
+ let logStr = '';
51
+ logger.addListener('info', (data) => { logStr += 'i'; });
52
+ logger.addListener('error', (data) => { logStr += 'e'; });
53
+ logger.addListener('stdout', (data) => { logStr += 's'; });
54
+ logger.stdout('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' });
55
+ assert.strictEqual(logStr, 'ies');
56
+ });
57
+ it('複数リスナーのテスト4', () => {
58
+ const logger = new NakoLogger();
59
+ let logStr = '';
60
+ logger.addListener('info', (data) => { logStr += 'i'; });
61
+ logger.addListener('error', (data) => { logStr += 'e'; });
62
+ logger.addListener('stdout', (data) => { logStr += 's'; });
63
+ logger.stdout('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' });
64
+ assert.strictEqual(logStr, 'ies');
65
+ });
66
+ it('複数リスナーのテスト5', () => {
67
+ const logger = new NakoLogger();
68
+ let logStr = '';
69
+ logger.addListener('all', (data) => { logStr += 'a'; });
70
+ logger.addListener('info', (data) => { logStr += 'i'; });
71
+ logger.addListener('error', (data) => { logStr += 'e'; });
72
+ logger.addListener('stdout', (data) => { logStr += 's'; });
73
+ logger.info('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' });
74
+ assert.strictEqual(logStr, 'ai');
75
+ });
76
+ });
@@ -0,0 +1,78 @@
1
+ import assert from 'assert'
2
+ import { NakoColors } from '../src/nako_colors.mjs'
3
+ import { NakoLogger } from '../src/nako_logger.mjs'
4
+
5
+ describe('nako_logger_test', () => {
6
+ it('色付けのテスト', () => {
7
+ const out = NakoColors.convertColorTextFormat(`デフォルト${NakoColors.color.bold}太字${NakoColors.color.red}太字赤${NakoColors.color.reset}デフォルト<script>`)
8
+ assert.strictEqual(out.noColor, 'デフォルト太字太字赤デフォルト<script>')
9
+ assert.strictEqual(out.nodeConsole, 'デフォルト\u001b[1m太字\u001b[31m太字赤\u001b[0mデフォルト<script>\u001b[0m')
10
+ assert.strictEqual(out.html, '<span>デフォルト</span><span style="color: inherit; font-weight: bold;">太字</span><span style="color: red; font-weight: bold;">太字赤</span><span style="color: inherit; font-weight: inherit;">デフォルト&lt;script&gt;</span>')
11
+ assert.deepStrictEqual(out.browserConsole, [
12
+ 'デフォルト%c太字%c太字赤%cデフォルト<script>',
13
+ 'color: inherit; font-weight: bold;',
14
+ 'color: red; font-weight: bold;',
15
+ 'color: inherit; font-weight: inherit;'
16
+ ])
17
+ })
18
+ it('ログの取得のテスト', (done) => {
19
+ const logger = new NakoLogger()
20
+ logger.addListener('info', (data) => {
21
+ assert.strictEqual(data.noColor, '[情報]main.nako3(2行目): foo')
22
+ done()
23
+ })
24
+ logger.info('foo', {
25
+ startOffset: 0,
26
+ endOffset: 0,
27
+ line: 1,
28
+ file: 'main.nako3'
29
+ })
30
+ })
31
+ it('複数のリスナーのテスト1', () => {
32
+ const logger = new NakoLogger()
33
+ let logStr = ''
34
+ logger.addListener('info', (data) => { logStr += 'i' })
35
+ logger.addListener('error', (data) => { logStr += 'e' })
36
+ logger.addListener('stdout', (data) => { logStr += 's' })
37
+ logger.error('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' })
38
+ assert.strictEqual(logStr, 'ie')
39
+ })
40
+ it('複数リスナーのテスト2', () => {
41
+ const logger = new NakoLogger()
42
+ let logStr = ''
43
+ logger.addListener('info', (data) => { logStr += 'i' })
44
+ logger.addListener('error', (data) => { logStr += 'e' })
45
+ logger.addListener('stdout', (data) => { logStr += 's' })
46
+ logger.info('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' })
47
+ assert.strictEqual(logStr, 'i')
48
+ })
49
+ it('複数リスナーのテスト3', () => {
50
+ const logger = new NakoLogger()
51
+ let logStr = ''
52
+ logger.addListener('info', (data) => { logStr += 'i' })
53
+ logger.addListener('error', (data) => { logStr += 'e' })
54
+ logger.addListener('stdout', (data) => { logStr += 's' })
55
+ logger.stdout('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' })
56
+ assert.strictEqual(logStr, 'ies')
57
+ })
58
+ it('複数リスナーのテスト4', () => {
59
+ const logger = new NakoLogger()
60
+ let logStr = ''
61
+ logger.addListener('info', (data) => { logStr += 'i' })
62
+ logger.addListener('error', (data) => { logStr += 'e' })
63
+ logger.addListener('stdout', (data) => { logStr += 's' })
64
+ logger.stdout('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' })
65
+ assert.strictEqual(logStr, 'ies')
66
+ })
67
+ it('複数リスナーのテスト5', () => {
68
+ const logger = new NakoLogger()
69
+ let logStr = ''
70
+ logger.addListener('all', (data) => { logStr += 'a' })
71
+ logger.addListener('info', (data) => { logStr += 'i' })
72
+ logger.addListener('error', (data) => { logStr += 'e' })
73
+ logger.addListener('stdout', (data) => { logStr += 's' })
74
+ logger.info('foo', { startOffset: 0, endOffset: 0, line: 1, file: 'main.nako3' })
75
+ assert.strictEqual(logStr, 'ai')
76
+ })
77
+ })
78
+
@@ -0,0 +1,38 @@
1
+ /* eslint-disable no-undef */
2
+ import assert from 'assert'
3
+ import { NakoCompiler } from '../src/nako3.mjs'
4
+
5
+ // eslint-disable-next-line no-undef
6
+ describe('plugin_csv_test', () => {
7
+ const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
8
+ const nako = new NakoCompiler()
9
+ nako.logger.debug('code=' + code)
10
+ const g = await nako.runAsync(code)
11
+ assert.strictEqual(g.log, res)
12
+ }
13
+
14
+ // --- test ---
15
+ it('CSV取得', async () => {
16
+ await cmp('a=「1,2,3\n4,5,6」のCSV取得。a[1][2]を表示', '6')
17
+ await cmp('a=「"a",b,c\n""a,b,c\na,""b,c\na,b,c""\n"a,\nb",c,d\na,"b,\nc",d\na,b,"c,\nd"」のCSV取得。a[5][1]を表示', 'b,\nc')
18
+ await cmp('a=「1,"a""a",2」のCSV取得。a[0][1]を表示', 'a"a')
19
+ await cmp('a=「1,"2""2",3\n4,5,6」のCSV取得。a[0][1]を表示', '2"2')
20
+ await cmp('a=「1,,3\n4,5,6」のCSV取得。a[0][2]を表示', '3')
21
+ await cmp('a=「1,2,3,\n4,5,6」のCSV取得。a[1][0]を表示', '4') // #353
22
+ })
23
+ it('TSV取得', async () => {
24
+ await cmp('a=「1\t2\t3\n4\t5\t6」のTSV取得。a[1][2]を表示', '6')
25
+ await cmp('a=「"a"\tb\tc\n""a\tb\tc\na\t""b\tc\na\tb\tc""\n"a\t\nb"\tc\td\na\t"b\t\nc"\td\na\tb\t"c\t\nd"」のTSV取得。a[5][1]を表示', 'b\t\nc')
26
+ await cmp('a=「1\t"a""a"\t2」のTSV取得。a[0][1]を表示', 'a"a')
27
+ await cmp('a=「1\t"2""2"\t3\n4\t5\t6」のTSV取得。a[0][1]を表示', '2"2')
28
+ await cmp('a=「1\t\t3\n4\t5\t6」のTSV取得。a[0][2]を表示', '3')
29
+ })
30
+ it('表CSV変換', async () => {
31
+ await cmp('[[1,2,3],[4,5,6]]を表CSV変換して表示', '1,2,3\r\n4,5,6')
32
+ await cmp('[[1,2,"3\r\n,"],[4,5,6]]を表CSV変換して表示', '1,2,"3\r\n,"\r\n4,5,6')
33
+ })
34
+ it('表TSV変換', async () => {
35
+ await cmp('[[1,2,3],[4,5,6]]を表TSV変換して表示', '1\t2\t3\r\n4\t5\t6')
36
+ await cmp('[[1,2,"3\r\n\t"],[4,5,6]]を表TSV変換して表示', '1\t2\t"3\r\n\t"\r\n4\t5\t6')
37
+ })
38
+ })
@@ -0,0 +1,18 @@
1
+ import assert from 'assert'
2
+ import { NakoCompiler } from '../src/nako3.mjs'
3
+
4
+ // eslint-disable-next-line no-undef
5
+ describe('plugin_promise_test', () => {
6
+ const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
7
+ const nako = new NakoCompiler()
8
+ nako.logger.debug('code=' + code)
9
+ const g = nako.runSync(code)
10
+ assert.strictEqual(g.log, res)
11
+ }
12
+ // --- test ---
13
+ // eslint-disable-next-line no-undef
14
+ it('Promise', async () => {
15
+ cmp('Fは動いた時には(成功,失敗)\n成功(9)\nここまで\nFの成功した時には\n対象を表示\nここまで\nその失敗した時には\n"NG"を表示\nここまで', '9')
16
+ cmp('Fは動いた時には(成功,失敗)\n失敗(5)\nここまで\nFの成功した時には\n"NG"を表示\nここまで\nその失敗した時には\n対象を表示\nここまで', '5')
17
+ })
18
+ })