nadesiko3 3.2.27
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.
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/bin/cnako3 +10 -0
- package/bin/cnako3.bat +11 -0
- package/bin/nako3server.bat +6 -0
- package/demo/ace_editor.html +90 -0
- package/demo/ace_editor_tabs.html +162 -0
- package/demo/basic.html +71 -0
- package/demo/browsers.html +128 -0
- package/demo/css/basic.css +3 -0
- package/demo/css/common.css +157 -0
- package/demo/css/editor.css +8 -0
- package/demo/css/flow.css +3 -0
- package/demo/css/index.css +3 -0
- package/demo/extlib/ace@1.4.12/ace.js +17 -0
- package/demo/extlib/ace@1.4.12/ext-code_lens.min.js +1 -0
- package/demo/extlib/ace@1.4.12/ext-language_tools.min.js +1 -0
- package/demo/extlib/ace@1.4.12/ext-options.min.js +1 -0
- package/demo/extlib/ace@1.4.12/ext-settings_menu.js +8 -0
- package/demo/extlib/ace@1.4.12/keybinding-vscode.js +8 -0
- package/demo/extlib/ace@1.4.12/theme-monokai.js +8 -0
- package/demo/extlib/ace@1.4.12/theme-xcode.js +8 -0
- package/demo/extlib/chart.js@3.2.1/chart.min.js +13 -0
- package/demo/extlib/pure-min.css +11 -0
- package/demo/flow.html +97 -0
- package/demo/graph.html +53 -0
- package/demo/image/nako.png +0 -0
- package/demo/image/nakopad-icon256.png +0 -0
- package/demo/image/turtle.fla +0 -0
- package/demo/image/turtle.png +0 -0
- package/demo/index.html +134 -0
- package/demo/js/common.js +17 -0
- package/demo/js/turtle3d_test.js +44 -0
- package/demo/js/turtle_test.js +44 -0
- package/demo/runscript.html +47 -0
- package/demo/runscript2.html +33 -0
- package/demo/turtle.html +58 -0
- package/demo/turtle2.html +141 -0
- package/demo/turtle3.html +278 -0
- package/demo/turtle3d.html +58 -0
- package/demo/turtle3d2.html +107 -0
- package/demo/version.html +24 -0
- package/doc/SETUP.md +172 -0
- package/doc/about.md +34 -0
- package/doc/browsers.md +60 -0
- package/doc/docgen.md +21 -0
- package/doc/editor.md +44 -0
- package/doc/files.md +37 -0
- package/doc/plugins.md +195 -0
- package/doc/release.md +78 -0
- package/doc/win32.md +57 -0
- package/package.json +196 -0
- package/release/_hash.txt +65 -0
- package/release/_script-tags.txt +13 -0
- package/release/command.json +1 -0
- package/release/command.json.js +1 -0
- package/release/command_cnako3.json +1 -0
- package/release/command_list.json +1 -0
- package/release/editor.js +2 -0
- package/release/editor.js.LICENSE.txt +32 -0
- package/release/josi.json +48 -0
- package/release/nako_gen_async.js +1 -0
- package/release/nako_gen_async.js.LICENSE.txt +595 -0
- package/release/plugin_caniuse.js +1 -0
- package/release/plugin_caniuse.js.LICENSE.txt +411 -0
- package/release/plugin_csv.js +1 -0
- package/release/plugin_csv.js.LICENSE.txt +367 -0
- package/release/plugin_datetime.js +1 -0
- package/release/plugin_datetime.js.LICENSE.txt +471 -0
- package/release/plugin_kansuji.js +1 -0
- package/release/plugin_kansuji.js.LICENSE.txt +491 -0
- package/release/plugin_markup.js +1 -0
- package/release/plugin_markup.js.LICENSE.txt +363 -0
- package/release/plugin_turtle.js +1 -0
- package/release/plugin_turtle.js.LICENSE.txt +435 -0
- package/release/plugin_webworker.js +1 -0
- package/release/plugin_webworker.js.LICENSE.txt +491 -0
- package/release/version.js +2 -0
- package/release/version.js.LICENSE.txt +32 -0
- package/release/wnako3.js +2 -0
- package/release/wnako3.js.LICENSE.txt +1 -0
- package/release/wnako3webworker.js +1 -0
- package/release/wnako3webworker.js.LICENSE.txt +847 -0
- package/release/yoyakugo.json +30 -0
- package/src/browsers.md +60 -0
- package/src/cnako3.js +466 -0
- package/src/commander_ja.js +154 -0
- package/src/enako3.js +69 -0
- package/src/era.json +22 -0
- package/src/index.js +5 -0
- package/src/nako3.js +836 -0
- package/src/nako3_assert.js +37 -0
- package/src/nako3editorfix.sfd +106 -0
- package/src/nako3editorfix.woff +0 -0
- package/src/nako3server.js +51 -0
- package/src/nako_colors.js +86 -0
- package/src/nako_errors.js +176 -0
- package/src/nako_gen.js +1459 -0
- package/src/nako_gen_async.js +1622 -0
- package/src/nako_global.js +113 -0
- package/src/nako_indent.js +480 -0
- package/src/nako_josi_list.js +46 -0
- package/src/nako_lex_rules.js +259 -0
- package/src/nako_lexer.js +576 -0
- package/src/nako_logger.js +138 -0
- package/src/nako_parser3.js +1768 -0
- package/src/nako_parser_base.js +265 -0
- package/src/nako_parser_const.js +37 -0
- package/src/nako_prepare.js +293 -0
- package/src/nako_reserved_words.js +35 -0
- package/src/nako_source_mapping.js +251 -0
- package/src/nako_test.js +37 -0
- package/src/nako_version.js +8 -0
- package/src/plugin_browser.js +191 -0
- package/src/plugin_browser_ajax.js +352 -0
- package/src/plugin_browser_audio.js +109 -0
- package/src/plugin_browser_canvas.js +462 -0
- package/src/plugin_browser_chart.js +296 -0
- package/src/plugin_browser_color.js +49 -0
- package/src/plugin_browser_crypto.js +26 -0
- package/src/plugin_browser_dialog.js +53 -0
- package/src/plugin_browser_dom_basic.js +322 -0
- package/src/plugin_browser_dom_event.js +193 -0
- package/src/plugin_browser_dom_parts.js +163 -0
- package/src/plugin_browser_geolocation.js +51 -0
- package/src/plugin_browser_hotkey.js +25 -0
- package/src/plugin_browser_html.js +59 -0
- package/src/plugin_browser_in_worker.js +44 -0
- package/src/plugin_browser_location.js +21 -0
- package/src/plugin_browser_speech.js +111 -0
- package/src/plugin_browser_storage.js +121 -0
- package/src/plugin_browser_system.js +12 -0
- package/src/plugin_browser_websocket.js +73 -0
- package/src/plugin_caniuse.js +24 -0
- package/src/plugin_csv.js +57 -0
- package/src/plugin_datetime.js +414 -0
- package/src/plugin_express.js +212 -0
- package/src/plugin_kansuji.js +224 -0
- package/src/plugin_keigo.js +55 -0
- package/src/plugin_markup.js +32 -0
- package/src/plugin_math.js +319 -0
- package/src/plugin_node.js +1018 -0
- package/src/plugin_promise.js +94 -0
- package/src/plugin_system.js +2109 -0
- package/src/plugin_test.js +38 -0
- package/src/plugin_turtle.js +646 -0
- package/src/plugin_webworker.js +334 -0
- package/src/plugin_weykturtle3d.js +1216 -0
- package/src/plugin_worker.js +92 -0
- package/src/repl.nako3 +63 -0
- package/src/turtle-elephant.png +0 -0
- package/src/turtle-panda.png +0 -0
- package/src/turtle64.png +0 -0
- package/src/wnako3.js +162 -0
- package/src/wnako3_editor.css +215 -0
- package/src/wnako3_editor.js +1645 -0
- package/src/wnako3_editor_marker_red.png +0 -0
- package/src/wnako3_editor_marker_red.xcf +0 -0
- package/src/wnako3_editor_marker_yellow.png +0 -0
- package/src/wnako3_editor_marker_yellow.xcf +0 -0
- package/src/wnako3webworker.js +70 -0
- package/test/ace_editor/karma.config.js +94 -0
- package/test/ace_editor/test/.babelrc.json +3 -0
- package/test/ace_editor/test/ace_editor_test.js +178 -0
- package/test/ace_editor/test/html/custom_context.html +140 -0
- package/test/async/async_basic_test.js +124 -0
- package/test/browser/karma.config.js +212 -0
- package/test/browser/test/.babelrc.json +3 -0
- package/test/browser/test/compare_util.js +50 -0
- package/test/browser/test/html/canvas_basic.html +1 -0
- package/test/browser/test/html/div_basic.html +2 -0
- package/test/browser/test/html/event_dom_form.html +4 -0
- package/test/browser/test/html/event_dom_scrolldiv.html +5 -0
- package/test/browser/test/image/canvas_test1.png +0 -0
- package/test/browser/test/image/canvas_test2.png +0 -0
- package/test/browser/test/image/canvas_test3.png +0 -0
- package/test/browser/test/image/canvas_test4.png +0 -0
- package/test/browser/test/image/canvas_test7.png +0 -0
- package/test/browser/test/image/canvas_test8.png +0 -0
- package/test/browser/test/image/canvas_test_blank.png +0 -0
- package/test/browser/test/image/elephant_kana.png +0 -0
- package/test/browser/test/image/panda_kana.png +0 -0
- package/test/browser/test/image/turtle_kana.png +0 -0
- package/test/browser/test/import_plugin_checker.js +24 -0
- package/test/browser/test/plugin_browser_test.js +52 -0
- package/test/browser/test/plugin_browser_test_ajax.js +123 -0
- package/test/browser/test/plugin_browser_test_color.js +18 -0
- package/test/browser/test/plugin_browser_test_dialog.js +72 -0
- package/test/browser/test/plugin_browser_test_dom_event.js +598 -0
- package/test/browser/test/plugin_browser_test_dom_parts.js +125 -0
- package/test/browser/test/plugin_browser_test_system.js +9 -0
- package/test/browser/test/plugin_turtle_test.js +817 -0
- package/test/browser/test/plugin_webworker_test.js +87 -0
- package/test/browser/test/require_test.js +71 -0
- package/test/bundled/karma.config.base.js +117 -0
- package/test/bundled/karma.config.js +86 -0
- package/test/bundled/test/.babelrc.json +3 -0
- package/test/bundled/test/bundled_test.js +69 -0
- package/test/bundled/test/html/custom_context.html +65 -0
- package/test/bundled/test/html/custom_debug.html +66 -0
- package/test/bundled/test4b.cmd +52 -0
- package/test/bundled/test_base/.babelrc.json +3 -0
- package/test/bundled/test_base/_checktool_test.js +25 -0
- package/test/bundled/test_base/basic_ajax_test.js +56 -0
- package/test/bundled/test_base/basic_async_test.js +18 -0
- package/test/bundled/test_base/basic_test.js +153 -0
- package/test/bundled/test_base/calc_test.js +132 -0
- package/test/bundled/test_base/css/browsers_box.css +114 -0
- package/test/bundled/test_base/html/custom_context.html +69 -0
- package/test/bundled/test_base/html/custom_debug.html +71 -0
- package/test/bundled/test_base/js/browsers_box.js +72 -0
- package/test/bundled/test_base/plugin_csv_test.js +37 -0
- package/test/bundled/test_base/plugin_datetime_test.js +115 -0
- package/test/bundled/test_base/plugin_kansuji_test.js +49 -0
- package/test/bundled/test_base/plugin_system_test.js +410 -0
- package/test/bundled/test_base/plugin_webworker_test.js +53 -0
- package/test/bundled/test_base/resources/ok.txt +1 -0
- package/test/bundled/test_base/test_utils.js +191 -0
- package/test/common/array_test.js +40 -0
- package/test/common/basic_test.js +317 -0
- package/test/common/calc_test.js +139 -0
- package/test/common/debug_test.js +16 -0
- package/test/common/error_test.js +16 -0
- package/test/common/flow_test.js +360 -0
- package/test/common/func_call.js +136 -0
- package/test/common/func_test.js +149 -0
- package/test/common/indent_test.js +362 -0
- package/test/common/lex_test.js +146 -0
- package/test/common/literal_test.js +72 -0
- package/test/common/nako_logger_test.js +26 -0
- package/test/common/plugin_browser_test.js +24 -0
- package/test/common/plugin_browser_ut_audio_test.js +88 -0
- package/test/common/plugin_browser_ut_color_test.js +21 -0
- package/test/common/plugin_browser_ut_dialog_test.js +100 -0
- package/test/common/plugin_browser_ut_html_test.js +13 -0
- package/test/common/plugin_browser_ut_system_test.js +10 -0
- package/test/common/plugin_csv_test.js +39 -0
- package/test/common/plugin_datetime_test.js +120 -0
- package/test/common/plugin_kansuji_test.js +59 -0
- package/test/common/plugin_promise_test.js +18 -0
- package/test/common/plugin_system_test.js +451 -0
- package/test/common/prepare_test.js +93 -0
- package/test/common/re_test.js +20 -0
- package/test/common/variable_scope_test.js +105 -0
- package/test/jsconfig.json +19 -0
- package/test/karma.config.js +91 -0
- package/test/node/add_test.nako3 +1 -0
- package/test/node/async_test.js +80 -0
- package/test/node/commander_ja_test.js +82 -0
- package/test/node/error_message_test.js +244 -0
- package/test/node/kai_test.nako3 +6 -0
- package/test/node/node_test.js +43 -0
- package/test/node/plugin_broken.js.txt +3 -0
- package/test/node/plugin_browser_ut_ajax_test.js +355 -0
- package/test/node/plugin_browser_ut_location_test.js +32 -0
- package/test/node/plugin_markup_test.js +44 -0
- package/test/node/plugin_math_test.js +42 -0
- package/test/node/plugin_node_test.js +93 -0
- package/test/node/plugin_test.js +16 -0
- package/test/node/relative_import_test_1.nako3 +1 -0
- package/test/node/relative_import_test_2.nako3 +2 -0
- package/test/node/require_nako3_test.js +59 -0
- package/test/node/requiretest.nako3 +4 -0
- package/test/node/requiretest_indirect.nako3 +1 -0
- package/test/node/requiretest_name.nako3 +5 -0
- package/test/node/runtime_error.nako3 +2 -0
- package/test/node/side_effects_test.js +106 -0
- package/test/node/sjis.txt +5 -0
- package/test/node/syntax_error.nako3 +2 -0
- package/test/node/wnako3_editor_test.js +360 -0
- package/tools/README.md +7 -0
- package/tools/nako3edit/html/edit.html +83 -0
- package/tools/nako3edit/html/edit_plugin.js +6 -0
- package/tools/nako3edit/html/files.html +49 -0
- package/tools/nako3edit/html/nako3edit.css +66 -0
- package/tools/nako3edit/index.nako3 +145 -0
- package/tools/nako3edit/run.js +12 -0
- package/tools/nako3server/html/edit.html +104 -0
- package/tools/nako3server/html/edit_plugin.js +6 -0
- package/tools/nako3server/html/files.html +53 -0
- package/tools/nako3server/html/nako3edit.css +66 -0
- package/tools/nako3server/index.nako3 +129 -0
- package/tools/nako3server/run.js +12 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
const assert = require('assert')
|
|
2
|
+
const NakoCompiler = require('../../src/nako3')
|
|
3
|
+
|
|
4
|
+
describe('flow_test', () => {
|
|
5
|
+
const nako = new NakoCompiler()
|
|
6
|
+
// nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
|
|
7
|
+
const cmp = (code, res) => {
|
|
8
|
+
nako.logger.debug('code=' + code)
|
|
9
|
+
assert.strictEqual(nako.run(code).log, res)
|
|
10
|
+
}
|
|
11
|
+
it('もし', () => {
|
|
12
|
+
cmp('もし3>1ならば「あ」と表示。', 'あ')
|
|
13
|
+
cmp('もし3<1ならば「あ」と表示。違えば「い」と表示。', 'い')
|
|
14
|
+
})
|
|
15
|
+
it('もし - AがBならば', () => {
|
|
16
|
+
cmp('もし3が3ならば\n「OK」と表示。\n違えば\n「NG」と表示。\nここまで\n', 'OK')
|
|
17
|
+
})
|
|
18
|
+
it('もし - ネスト', () => {
|
|
19
|
+
cmp('A=5\n' +
|
|
20
|
+
'もしAが3以上ならば\n' +
|
|
21
|
+
' もしA=5ならば\n' +
|
|
22
|
+
' 「OK」と表示。\n' +
|
|
23
|
+
' 違えば\n' +
|
|
24
|
+
' 「NG」と表示。\n' +
|
|
25
|
+
' ここまで。\n' +
|
|
26
|
+
'違えば\n' +
|
|
27
|
+
' 「NG」と表示。\n' +
|
|
28
|
+
'ここまで。\n', 'OK')
|
|
29
|
+
cmp('A=1\n' +
|
|
30
|
+
'もしAが3以上ならば\n' +
|
|
31
|
+
' もしA=5ならば\n' +
|
|
32
|
+
' 「NG」と表示。\n' +
|
|
33
|
+
' 違えば\n' +
|
|
34
|
+
' 「NG」と表示。\n' +
|
|
35
|
+
' ここまで。\n' +
|
|
36
|
+
'違えば\n' +
|
|
37
|
+
' 「OK」と表示。\n' +
|
|
38
|
+
'ここまで。\n', 'OK')
|
|
39
|
+
})
|
|
40
|
+
it('もし - ネスト - 違えばの一致', () => {
|
|
41
|
+
cmp('A=2\n' +
|
|
42
|
+
'もしAが3以上ならば\n' +
|
|
43
|
+
' もしA=5ならば\n' +
|
|
44
|
+
' 「NG」と表示。\n' +
|
|
45
|
+
' ここまで\n' +
|
|
46
|
+
'違えば\n' +
|
|
47
|
+
' 「OK」と表示。\n' +
|
|
48
|
+
'ここまで。\n' +
|
|
49
|
+
'', 'OK')
|
|
50
|
+
})
|
|
51
|
+
it('違えばもし', () => {
|
|
52
|
+
// 「違えば」の次がeolではないときfalse_blockが単文扱いになり「ここまで」が不要。
|
|
53
|
+
cmp('もし0ならば\n' +
|
|
54
|
+
' 「NG」を表示\n' +
|
|
55
|
+
'違えばもし0ならば\n' +
|
|
56
|
+
' 「NG」を表示\n' +
|
|
57
|
+
'違えばもし1ならば\n' +
|
|
58
|
+
' 「OK」を表示\n' +
|
|
59
|
+
'違えば\n' +
|
|
60
|
+
' 「NG」を表示\n' +
|
|
61
|
+
'ここまで\n', 'OK')
|
|
62
|
+
|
|
63
|
+
cmp('もし0ならば\n' +
|
|
64
|
+
' 「NG」を表示\n' +
|
|
65
|
+
'違えば、もし0ならば\n' +
|
|
66
|
+
' 「NG」を表示\n' +
|
|
67
|
+
'違えば、もし1ならば\n' +
|
|
68
|
+
' 「OK」を表示\n' +
|
|
69
|
+
'違えば\n' +
|
|
70
|
+
' 「NG」を表示\n' +
|
|
71
|
+
'ここまで\n', 'OK')
|
|
72
|
+
})
|
|
73
|
+
it('回', () => {
|
|
74
|
+
cmp('3回「あ」と表示。', 'あ\nあ\nあ')
|
|
75
|
+
cmp('A=3;(A)回、Aを表示。', '3\n3\n3')
|
|
76
|
+
})
|
|
77
|
+
it('回、ここから', () => {
|
|
78
|
+
cmp('A=3;(A)回、ここから\nAを表示。\nここまで\n', '3\n3\n3')
|
|
79
|
+
cmp('A=3;(A)回ここから\nAを表示。\nここまで\n', '3\n3\n3')
|
|
80
|
+
})
|
|
81
|
+
it('回、繰り返す(#924)', () => {
|
|
82
|
+
cmp('A=3;(A)回、繰り返す\nAを表示。\nここまで\n', '3\n3\n3')
|
|
83
|
+
cmp('A=3;(A)回ここから、繰り返す\nAを表示。\nここまで\n', '3\n3\n3')
|
|
84
|
+
})
|
|
85
|
+
it('回繰り返す(#924)', () => {
|
|
86
|
+
cmp('A=3;(A)回繰り返す\nAを表示。\nここまで\n', '3\n3\n3')
|
|
87
|
+
cmp('A=3;(A)回繰り返す、ここから\nAを表示。\nここまで\n', '3\n3\n3')
|
|
88
|
+
})
|
|
89
|
+
it('回 - 「それ」の自動挿入', () => {
|
|
90
|
+
cmp('1と2を足す\n回\n1を表示\nここまで', '1\n1\n1')
|
|
91
|
+
})
|
|
92
|
+
it('の間', () => {
|
|
93
|
+
cmp('N=3;\n(N>0)の間\nNを表示\nN=N-1\nここまで', '3\n2\n1')
|
|
94
|
+
})
|
|
95
|
+
it('の間、ここから', () => {
|
|
96
|
+
cmp('N=3;\n(N>0)の間、ここから\nNを表示\nN=N-1\nここまで', '3\n2\n1')
|
|
97
|
+
cmp('N=3;\n(N>0)の間ここから\nNを表示\nN=N-1\nここまで', '3\n2\n1')
|
|
98
|
+
})
|
|
99
|
+
it('の間、繰り返す #927', () => {
|
|
100
|
+
cmp('N=3;\n(N>0)の間、繰り返す\nNを表示\nN=N-1\nここまで', '3\n2\n1')
|
|
101
|
+
cmp('N=3;\n(N>0)の間繰り返す\nNを表示\nN=N-1\nここまで', '3\n2\n1')
|
|
102
|
+
})
|
|
103
|
+
it('一致する間', () => {
|
|
104
|
+
cmp('●(AとBが)超一致するとは\n' +
|
|
105
|
+
' それはAとBが等しい\n' +
|
|
106
|
+
'ここまで\n' +
|
|
107
|
+
'a=1\n' +
|
|
108
|
+
'i=0\n' +
|
|
109
|
+
'aと1が超一致する間\n' +
|
|
110
|
+
' iを表示\n' +
|
|
111
|
+
' i=i+1\n' +
|
|
112
|
+
' もしiが3以上ならば\n' +
|
|
113
|
+
' a=0\n' +
|
|
114
|
+
' ここまで\n' +
|
|
115
|
+
'ここまで',
|
|
116
|
+
// ---
|
|
117
|
+
'0\n1\n2')
|
|
118
|
+
})
|
|
119
|
+
it('等しい間', () => {
|
|
120
|
+
cmp('a=1\n' +
|
|
121
|
+
'i=0\n' +
|
|
122
|
+
'aと1が等しい間\n' +
|
|
123
|
+
' iを表示\n' +
|
|
124
|
+
' i=i+1\n' +
|
|
125
|
+
' もしiが3以上ならば\n' +
|
|
126
|
+
' a=0\n' +
|
|
127
|
+
' ここまで\n' +
|
|
128
|
+
'ここまで',
|
|
129
|
+
// ---
|
|
130
|
+
'0\n1\n2')
|
|
131
|
+
})
|
|
132
|
+
it('未満の間', () => {
|
|
133
|
+
cmp('i=0\n' +
|
|
134
|
+
'iが3未満の間\n' +
|
|
135
|
+
' iを表示\n' +
|
|
136
|
+
' i=i+1\n' +
|
|
137
|
+
'ここまで',
|
|
138
|
+
// ---
|
|
139
|
+
'0\n1\n2')
|
|
140
|
+
})
|
|
141
|
+
it('超えの間', () => {
|
|
142
|
+
cmp('i=0' +
|
|
143
|
+
'iが-3超えの間\n' +
|
|
144
|
+
' iを表示\n' +
|
|
145
|
+
' i=i-1\n' +
|
|
146
|
+
'ここまで',
|
|
147
|
+
// ---
|
|
148
|
+
'0\n-1\n-2')
|
|
149
|
+
})
|
|
150
|
+
it('範囲内の間', () => {
|
|
151
|
+
cmp('i=0' +
|
|
152
|
+
'iが-3から3の範囲内の間\n' +
|
|
153
|
+
' iを表示\n' +
|
|
154
|
+
' i=i+1\n' +
|
|
155
|
+
'ここまで',
|
|
156
|
+
// ---
|
|
157
|
+
'0\n1\n2\n3')
|
|
158
|
+
})
|
|
159
|
+
it('繰り返す', () => {
|
|
160
|
+
cmp('Nを1から3まで繰り返す\nNを表示\nここまで', '1\n2\n3')
|
|
161
|
+
cmp('Nを1から3まで繰り返す\n Nを表示\nここまで', '1\n2\n3')
|
|
162
|
+
})
|
|
163
|
+
it('繰り返す2', () => {
|
|
164
|
+
cmp('1から3まで繰り返す\nそれを表示\nここまで', '1\n2\n3')
|
|
165
|
+
})
|
|
166
|
+
it('連続計算', () => {
|
|
167
|
+
cmp('3に5を足してNに代入;Nを表示', '8')
|
|
168
|
+
cmp('3に5を足して2を掛けて表示', '16')
|
|
169
|
+
})
|
|
170
|
+
it('もし-日本語による比較', () => {
|
|
171
|
+
cmp('もし3が3と等しいならば「OK」と表示。', 'OK')
|
|
172
|
+
cmp('もし(3+2)が5と等しいならば「OK」と表示。', 'OK')
|
|
173
|
+
cmp('もし(3+2)が1以上ならば「OK」と表示。', 'OK')
|
|
174
|
+
cmp('もし3が5未満ならば「OK」と表示。', 'OK')
|
|
175
|
+
cmp('もし(3+10)が(5+10)以下ならば「OK」と表示。', 'OK')
|
|
176
|
+
})
|
|
177
|
+
it('もし--一行文。違えば', () => {
|
|
178
|
+
cmp('もし(3+10)が5以下ならば「ng」と表示。違えば「ok」と表示。', 'ok')
|
|
179
|
+
})
|
|
180
|
+
it('もし-しなければ', () => {
|
|
181
|
+
cmp('もし{ "a": 30 }に「b」がハッシュキー存在しなければ\n「ok」と表示\nここまで', 'ok')
|
|
182
|
+
cmp('もし1と2が等しくなければ\n「ok」と表示\nここまで', 'ok')
|
|
183
|
+
})
|
|
184
|
+
it('回-break', () => {
|
|
185
|
+
cmp('3回\n\'a\'と表示。もし(回数=2)ならば、抜ける;\n;ここまで;', 'a\na')
|
|
186
|
+
cmp('3回\n\'a\'と表示。もし、回数が2ならば、抜ける;\n;ここまで;', 'a\na')
|
|
187
|
+
})
|
|
188
|
+
it('反復 - 配列', () => {
|
|
189
|
+
cmp('[1,2,3]を反復\n対象を表示\nここまで\n', '1\n2\n3')
|
|
190
|
+
})
|
|
191
|
+
it('反復 - オブジェクト', () => {
|
|
192
|
+
cmp('{\'a\':1,\'b\':2,\'c\':3}を反復\n対象を表示\nここまで\n', '1\n2\n3')
|
|
193
|
+
cmp('{\'a\':1,\'b\':2,\'c\':3}を反復\n対象キーを表示\nここまで\n', 'a\nb\nc')
|
|
194
|
+
})
|
|
195
|
+
it('反復 - 変数付き', () => {
|
|
196
|
+
cmp('A=[1,2,3];NでAを反復\nNを表示\nここまで\n', '1\n2\n3')
|
|
197
|
+
cmp('Nで[1,2,3]を反復\nNを表示\nここまで\n', '1\n2\n3')
|
|
198
|
+
})
|
|
199
|
+
it('反復2 - 変数付き', () => {
|
|
200
|
+
cmp('A=[[3,30],[1,10],[2,20]];NでAを反復\nN[1]を表示\nここまで\n', '30\n10\n20')
|
|
201
|
+
})
|
|
202
|
+
it('反復 - prototypeを無視', () => {
|
|
203
|
+
cmp('f=『function F(){}; F.prototype.foo = 20; const f = new F(); f.p1 = 10; f』をJS実行。fを反復して表示', '10')
|
|
204
|
+
})
|
|
205
|
+
it('ここから反復', () => {
|
|
206
|
+
cmp('それは[1,2,3];ここから反復\n表示\nここまで\n', '1\n2\n3')
|
|
207
|
+
})
|
|
208
|
+
it('ここから繰り返し', () => {
|
|
209
|
+
cmp('ここから1から3まで繰り返し\n表示\nここまで\n', '1\n2\n3')
|
|
210
|
+
})
|
|
211
|
+
it('ここから3回', () => {
|
|
212
|
+
cmp('ここから3回\n表示\nここまで\n', '1\n2\n3')
|
|
213
|
+
})
|
|
214
|
+
it('不等号', () => {
|
|
215
|
+
cmp('もし、5≧5ならば、「あ」と表示。', 'あ')
|
|
216
|
+
cmp('もし、5≧3ならば、「あ」と表示。', 'あ')
|
|
217
|
+
cmp('もし、5≦5ならば、「あ」と表示。', 'あ')
|
|
218
|
+
cmp('もし、3≦5ならば、「あ」と表示。', 'あ')
|
|
219
|
+
cmp('もし、5=5ならば、「あ」と表示。', 'あ')
|
|
220
|
+
cmp('もし、3≠5ならば、「あ」と表示。', 'あ')
|
|
221
|
+
})
|
|
222
|
+
it('繰り返しのネスト', () => {
|
|
223
|
+
cmp('C=0;Iを0から3まで繰り返す\nJを0から3まで繰り返す\nC=C+1;ここまで;ここまで;Cを表示', '16')
|
|
224
|
+
})
|
|
225
|
+
it('繰り返し:AからBまででA>Bの時', () => {
|
|
226
|
+
cmp('Iを3から0まで繰り返す;Iを表示;ここまで', '3\n2\n1\n0')
|
|
227
|
+
cmp('Iを11から9まで繰り返す;Iを表示;ここまで', '11\n10\n9')
|
|
228
|
+
})
|
|
229
|
+
it('繰り返し:AからBまででA>Bの時', () => {
|
|
230
|
+
cmp('Iを3から0まで繰り返す;Iを表示;ここまで', '3\n2\n1\n0')
|
|
231
|
+
cmp('Iを11から9まで繰り返す;Iを表示;ここまで', '11\n10\n9')
|
|
232
|
+
})
|
|
233
|
+
it('もし、と戻るの組み合わせ', () => {
|
|
234
|
+
cmp('●テスト処理\n' +
|
|
235
|
+
' 「あ」と表示\n' +
|
|
236
|
+
' もし、3=3ならば、戻る。\n' +
|
|
237
|
+
' 「ここには来ない」と表示\n' +
|
|
238
|
+
'ここまで\n' +
|
|
239
|
+
'テスト処理。', 'あ')
|
|
240
|
+
cmp('●(Sを)テスト処理\n' +
|
|
241
|
+
' Sを大文字変換して表示。\n' +
|
|
242
|
+
' もし、そうならば、戻る。\n' +
|
|
243
|
+
' 「ここには来ない」と表示\n' +
|
|
244
|
+
'ここまで\n' +
|
|
245
|
+
'「a」をテスト処理。', 'A')
|
|
246
|
+
})
|
|
247
|
+
it('もしと抜けるの組み合わせ', () => {
|
|
248
|
+
cmp('Iを1から3まで繰り返す\n' +
|
|
249
|
+
' 「あ」と表示\n' +
|
|
250
|
+
' もし、I=2ならば、抜ける。\n' +
|
|
251
|
+
' 「い」と表示\n' +
|
|
252
|
+
'ここまで\n', 'あ\nい\nあ')
|
|
253
|
+
cmp('Iを1から3まで繰り返す\n' +
|
|
254
|
+
' 2回、「あ」と表示。\n' +
|
|
255
|
+
' もし、I=2ならば、抜ける。\n' +
|
|
256
|
+
' 「い」と表示\n' +
|
|
257
|
+
'ここまで\n', 'あ\nあ\nい\nあ\nあ')
|
|
258
|
+
cmp('Iを1から3まで繰り返す\n' +
|
|
259
|
+
' 「あ」と表示\n' +
|
|
260
|
+
' もし、I=2ならば、「う」と表示して、抜ける。\n' +
|
|
261
|
+
' 「い」と表示\n' +
|
|
262
|
+
'ここまで\n', 'あ\nい\nあ\nう')
|
|
263
|
+
})
|
|
264
|
+
it('もし文のエラー(#378)', () => {
|
|
265
|
+
cmp('●AAAとは\n' +
|
|
266
|
+
' 列を1から3まで繰り返す。\n' +
|
|
267
|
+
' 列を表示。'+
|
|
268
|
+
' もし、列=2ならば、「*」と表示。\n' +
|
|
269
|
+
' ここまで。\n' +
|
|
270
|
+
'ここまで\n' +
|
|
271
|
+
'AAA', '1\n2\n*\n3')
|
|
272
|
+
})
|
|
273
|
+
it('条件分岐(#694)', () => {
|
|
274
|
+
cmp('2で条件分岐\n' +
|
|
275
|
+
' 1ならば\n「a」と表示\nここまで\n' +
|
|
276
|
+
' 2ならば\n「b」と表示\nここまで\n' +
|
|
277
|
+
' 3ならば\n「c」と表示\nここまで\n' +
|
|
278
|
+
' 違えば\n「d」と表示\nここまで\n' +
|
|
279
|
+
'ここまで\n',
|
|
280
|
+
'b')
|
|
281
|
+
cmp('3で条件分岐\n' +
|
|
282
|
+
' 1ならば\n「a」と表示\nここまで\n' +
|
|
283
|
+
' 2ならば\n「b」と表示\nここまで\n' +
|
|
284
|
+
' 3ならば\n「c」と表示\nここまで\n' +
|
|
285
|
+
' 違えば\n「d」と表示\nここまで\n' +
|
|
286
|
+
'ここまで\n',
|
|
287
|
+
'c')
|
|
288
|
+
cmp('5で条件分岐\n' +
|
|
289
|
+
' 1ならば\n「a」と表示\nここまで\n' +
|
|
290
|
+
' 2ならば\n「b」と表示\nここまで\n' +
|
|
291
|
+
' 3ならば\n「c」と表示\nここまで\n' +
|
|
292
|
+
' 違えば\n「d」と表示\nここまで\n' +
|
|
293
|
+
'ここまで\n',
|
|
294
|
+
'd')
|
|
295
|
+
})
|
|
296
|
+
it('条件分岐で違えばを省略', () => {
|
|
297
|
+
cmp('2で条件分岐\n' +
|
|
298
|
+
' 1ならば\n「a」と表示\nここまで\n' +
|
|
299
|
+
' 2ならば\n「b」と表示\nここまで\n' +
|
|
300
|
+
' 3ならば\n「c」と表示\nここまで\n' +
|
|
301
|
+
'ここまで\n',
|
|
302
|
+
'b')
|
|
303
|
+
cmp('5で条件分岐\n' +
|
|
304
|
+
' 1ならば\n「a」と表示\nここまで\n' +
|
|
305
|
+
' 2ならば\n「b」と表示\nここまで\n' +
|
|
306
|
+
' 3ならば\n「c」と表示\nここまで\n' +
|
|
307
|
+
'ここまで\n',
|
|
308
|
+
'')
|
|
309
|
+
})
|
|
310
|
+
it('条件分岐で違えばの後にカンマがあってもエラーにならない #942', () => {
|
|
311
|
+
cmp('A=0;2で条件分岐\n' +
|
|
312
|
+
' 1ならば、A=A+1\nここまで\n' +
|
|
313
|
+
' 2ならば、A=A+2\nここまで\n' +
|
|
314
|
+
' 3ならば、A=A+3\nここまで\n' +
|
|
315
|
+
' 違えば、A=A+10\nここまで\n' +
|
|
316
|
+
'ここまで\nAを表示',
|
|
317
|
+
'2')
|
|
318
|
+
})
|
|
319
|
+
it('N回をN|回に分ける', () => {
|
|
320
|
+
cmp('S="";N=3;N回、S=S&"a";Sを表示。', 'aaa')
|
|
321
|
+
cmp('S="";N=3;N回\nS=S&"a";💧;Sを表示。', 'aaa')
|
|
322
|
+
})
|
|
323
|
+
it('「、」と「,」の違いが分かりづらい #877', () => {
|
|
324
|
+
cmp('もし,0ならば,\n' +
|
|
325
|
+
' 「NG」を表示\n' +
|
|
326
|
+
'違えば,もし,0ならば\n' +
|
|
327
|
+
' 「NG」を表示\n' +
|
|
328
|
+
'違えば,もし,1ならば\n' +
|
|
329
|
+
' 「OK」を表示\n' +
|
|
330
|
+
'違えば,\n' +
|
|
331
|
+
' 「NG」を表示\n' +
|
|
332
|
+
'ここまで\n', 'OK')
|
|
333
|
+
cmp('S="";[1,2,3]を,反復,\n' +
|
|
334
|
+
' S=S&対象\n' +
|
|
335
|
+
'ここまで。Sを表示。\n', '123')
|
|
336
|
+
cmp('S="";[1,2,3]を,反復,ここから,\n' +
|
|
337
|
+
' S=S&対象\n' +
|
|
338
|
+
'ここまで。Sを表示。\n', '123')
|
|
339
|
+
})
|
|
340
|
+
it('「。。。」=「ここまで」#925', () => {
|
|
341
|
+
cmp('S="";3回;S=S&"a";;;Sを表示。', 'aaa')
|
|
342
|
+
cmp('A=0;3回\nA=A+1;;;Aを表示。', '3')
|
|
343
|
+
cmp(
|
|
344
|
+
'A=0;3回\n' +
|
|
345
|
+
' A=A+1;\n' +
|
|
346
|
+
' A=A+1;\n' +
|
|
347
|
+
'。。。;Aを表示。', '6')
|
|
348
|
+
cmp(
|
|
349
|
+
'S=「」。3回\n' +
|
|
350
|
+
' S=S&「a」\n' +
|
|
351
|
+
' S=S&「b」。。。\n' +
|
|
352
|
+
'Sを表示。\n', 'ababab')
|
|
353
|
+
})
|
|
354
|
+
it('「或いは」「あるいは」を追加#987', () => {
|
|
355
|
+
cmp('A=3;もし、A=3或いはA=5あるいはA=7ならば「OK」と表示。違えば「NG」と表示。', 'OK')
|
|
356
|
+
cmp('A=3;もし、A=5あるいはA=3ならば「OK」と表示。違えば「NG」と表示。', 'OK')
|
|
357
|
+
cmp('A=空;B=3;もし(A=空)あるいは(B=空)ならば、"OK"と表示;違えば「NG」と表示。', 'OK')
|
|
358
|
+
})
|
|
359
|
+
})
|
|
360
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const assert = require('assert')
|
|
2
|
+
const NakoCompiler = require('../../src/nako3')
|
|
3
|
+
const NakoSyntaxError = require('../../src/nako_parser_base').NakoSyntaxError
|
|
4
|
+
|
|
5
|
+
describe('関数呼び出しテスト', () => {
|
|
6
|
+
const nako = new NakoCompiler()
|
|
7
|
+
// nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
|
|
8
|
+
const cmp = (code, res) => {
|
|
9
|
+
nako.logger.debug('code=' + code)
|
|
10
|
+
assert.strictEqual(nako.run(code).log, res)
|
|
11
|
+
}
|
|
12
|
+
const cmd = (code) => {
|
|
13
|
+
nako.logger.debug('code=' + code)
|
|
14
|
+
nako.run(code)
|
|
15
|
+
}
|
|
16
|
+
// --- test ---
|
|
17
|
+
it('関数式の呼び出し - 足す(2,3)を表示。', () => {
|
|
18
|
+
cmp('足す(2,3)を表示。', '5')
|
|
19
|
+
})
|
|
20
|
+
it('四則演算を連文で', () => {
|
|
21
|
+
cmp('1に2を足して3を掛けて3で割って2を引いて表示', '1')
|
|
22
|
+
})
|
|
23
|
+
it('「そう」のテスト', () => {
|
|
24
|
+
cmp('3が1以上。もしそうならば「真」と表示。', '真')
|
|
25
|
+
})
|
|
26
|
+
it('後方で定義した関数を前方で使う1', () => {
|
|
27
|
+
cmp('HOGE(3,4)を表示;●(A,B)HOGEとは;それはA+B;ここまで;', '7')
|
|
28
|
+
cmp('「姫」と「殿」が出会って表示;●(AとBが)出会うとは;それはA&B;ここまで;', '姫殿')
|
|
29
|
+
})
|
|
30
|
+
it('後方で定義した関数を前方で使う2', () => {
|
|
31
|
+
cmp('Nとは変数=30;HOGE(3,4)を表示;●(A,B)HOGEとは;それはA+B+N;ここまで;', '37')
|
|
32
|
+
})
|
|
33
|
+
it('代入と表示', () => {
|
|
34
|
+
cmp('A=今日;もし(今日=A)ならば「1」と表示', '1')
|
|
35
|
+
})
|
|
36
|
+
it('代入1', () => {
|
|
37
|
+
cmp('A=今日の曜日番号取得;B=(今日)の曜日番号取得;もしA=Bならば「等しい」を表示。', '等しい')
|
|
38
|
+
})
|
|
39
|
+
it('代入2', () => {
|
|
40
|
+
cmp('Aは、今日の曜日番号取得;Bは、(今日)の曜日番号取得;もしA=Bならば「等しい」を表示。', '等しい')
|
|
41
|
+
})
|
|
42
|
+
it('代入3', () => {
|
|
43
|
+
cmp('A=(今日の曜日番号取得)+1;B=((今日)の曜日番号取得)+1;もしA=Bならば「等しい」を表示。', '等しい')
|
|
44
|
+
})
|
|
45
|
+
it('配列への代入', () => {
|
|
46
|
+
cmp('値段は空配列。値段[0]に3000を代入。値段[0]を表示。', '3000')
|
|
47
|
+
})
|
|
48
|
+
it('**には**構文 - 基本', () => {
|
|
49
|
+
cmp('実行には;「あ」と表示;ここまで', 'あ')
|
|
50
|
+
})
|
|
51
|
+
it('**には**構文 - 配列カスタムソート', () => {
|
|
52
|
+
cmp('A=[5,1,3];Aを配列カスタムソートするには(a,b);それはb-a;ここまで;Aを「:」で配列結合して表示', '5:3:1')
|
|
53
|
+
})
|
|
54
|
+
it('階乗計算 - 再帰', () => {
|
|
55
|
+
cmp('●(VをAのBで)階乗計算とは;' +
|
|
56
|
+
'もし、Bが0以下ならば、Vを戻す。;(V*A)をAの(B-1)で階乗計算して戻す。' +
|
|
57
|
+
'ここまで。;1を2の3で階乗計算して表示。', '8')
|
|
58
|
+
})
|
|
59
|
+
it('連続文後の代入', () => {
|
|
60
|
+
cmp('「2017/09/01T00:00:99」の「T」を「 」に置換して「 」まで切り取り、対象日に代入。対象日を表示。', '2017/09/01')
|
|
61
|
+
})
|
|
62
|
+
it('連続文後の=代入', () => {
|
|
63
|
+
cmp('対象日=「2017/09/01T00:00:99」の「T」を「 」に置換して「 」まで切り取る。対象日を表示。', '2017/09/01')
|
|
64
|
+
})
|
|
65
|
+
it('関数の引数に関数呼び出しがある場合', () => {
|
|
66
|
+
cmp('A=「ab」;「abcd」の1から(Aの文字数)だけ文字削除。それを表示。', 'cd')
|
|
67
|
+
})
|
|
68
|
+
it('配列カスタムソートの基本的な使い方例', ()=> {
|
|
69
|
+
cmp('●MYSORT(a,b)とは\n' +
|
|
70
|
+
'(INT(a) - INT(b))で戻る。\n' +
|
|
71
|
+
'ここまで。\n' +
|
|
72
|
+
'ARY=[8,3,4];' +
|
|
73
|
+
'「MYSORT」でARYを配列カスタムソートしてJSONエンコードして表示', '[3,4,8]')
|
|
74
|
+
})
|
|
75
|
+
it('引数の順番を入れ替えて呼び出す(#342)その1', () => {
|
|
76
|
+
cmp('『abc』の『a』を「*」に置換。表示', '*bc')
|
|
77
|
+
cmp('『a』を「*」に『abc』の置換。表示', '*bc')
|
|
78
|
+
cmp('「*」へ『a』から『abc』の置換。表示', '*bc')
|
|
79
|
+
cmp('「abcdefg」の1から3だけ文字削除して表示。', 'defg')
|
|
80
|
+
cmp('「abcdefg」の1から3を文字削除して表示。', 'defg')
|
|
81
|
+
cmp('1から3を「abcdefg」の文字削除して表示。', 'defg')
|
|
82
|
+
cmp('3を「abcdefg」の1から文字削除して表示。', 'defg')
|
|
83
|
+
cmp('3だけ「abcdefg」の1から文字削除して表示。', 'defg')
|
|
84
|
+
})
|
|
85
|
+
it('引数の順番を入れ替えて呼び出す(#342)その2', () => {
|
|
86
|
+
cmp('[8,3,4]の配列カスタムソートには(a,b)\nそれは(a - b)\nここまで。それをJSONエンコードして表示', '[3,4,8]')
|
|
87
|
+
cmp('[8,3,4]を配列カスタムソートには(a,b)\nそれは(a - b)\nここまで。それをJSONエンコードして表示', '[3,4,8]')
|
|
88
|
+
cmp('[8,3,4]の配列カスタムソートには(a,b)\nそれは(INT(a) - INT(b))\nここまで。それをJSONエンコードして表示', '[3,4,8]')
|
|
89
|
+
})
|
|
90
|
+
it('引数の順番を入れ替えて呼び出す(#342)その3', () => {
|
|
91
|
+
cmp('ARY=[8,3,4];' +
|
|
92
|
+
'ARYの配列カスタムソートには(a,b)\n' +
|
|
93
|
+
'aと255のXORをAに代入。bと255のXORをBに代入。' +
|
|
94
|
+
'それは(INT(a) - INT(b))\n' +
|
|
95
|
+
'ここまで。\n' +
|
|
96
|
+
'ARYをJSONエンコードして表示', '[3,4,8]')
|
|
97
|
+
})
|
|
98
|
+
it('可変長引数 #729', () => { // 経緯 #501 → #729
|
|
99
|
+
cmp('連続加算(1,2,3)を表示。', '6')
|
|
100
|
+
cmp('1と2と3を連続加算して表示。', '6')
|
|
101
|
+
cmp('1に2と3を連続加算して表示。', '6')
|
|
102
|
+
})
|
|
103
|
+
// ---
|
|
104
|
+
it('関数呼び出し演算子に変更(1) #891', () => {
|
|
105
|
+
cmp('表示←3', '3')
|
|
106
|
+
cmp('表示←3を', '3')
|
|
107
|
+
cmp('表示←INT←3.14', '3')
|
|
108
|
+
cmp('足す←2に3を;それを表示;', '5')
|
|
109
|
+
cmp('割る←10を2で;それを表示;', '5')
|
|
110
|
+
cmp('割る<--2で10を;それを表示', '5')
|
|
111
|
+
})
|
|
112
|
+
it('関数呼び出し演算子に変更(2) #891', () => {
|
|
113
|
+
cmp('A=(割る<--10を2で)+2;Aを表示;', '7')
|
|
114
|
+
cmp('(割る←10を2で)を表示;', '5')
|
|
115
|
+
cmp('割る<--2で(割る←100を10で)を;それを表示', '5')
|
|
116
|
+
cmp('(割る←100を10で)を2で割って表示', '5')
|
|
117
|
+
})
|
|
118
|
+
it('関数呼び出し演算子に変更(ユーザー関数) #891', () => {
|
|
119
|
+
cmp('●(Aを)AAA;それはA*2;ここまで;AAA←30;それを表示', '60')
|
|
120
|
+
cmp('●(AをBで)AAA;それはA/B;ここまで;AAA←30を3で;それを表示', '10')
|
|
121
|
+
})
|
|
122
|
+
it('エラー/関数の呼び出し演算子 #891/引数がない関数', () => {
|
|
123
|
+
const funcName = 'AAA'
|
|
124
|
+
assert.throws(
|
|
125
|
+
() => cmd(`●${funcName};それは5;ここまで;${funcName}←`),
|
|
126
|
+
NakoSyntaxError, `引数がない関数『${funcName}』を関数呼び出し演算子で呼び出すことはできません。`
|
|
127
|
+
)
|
|
128
|
+
})
|
|
129
|
+
it('エラー/関数の呼び出し演算子 #891/引数が異なる', () => {
|
|
130
|
+
const funcName = 'テスト'
|
|
131
|
+
assert.throws(
|
|
132
|
+
() => cmd(`●${funcName}(aとbを);それはa*b;ここまで;${funcName}<--8と`),
|
|
133
|
+
NakoSyntaxError, `関数『${funcName}』呼び出しで引数の数(1)が定義(2)と違います。`
|
|
134
|
+
)
|
|
135
|
+
})
|
|
136
|
+
})
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const assert = require('assert')
|
|
2
|
+
const NakoCompiler = require('../../src/nako3')
|
|
3
|
+
|
|
4
|
+
describe('func_test', () => {
|
|
5
|
+
const nako = new NakoCompiler()
|
|
6
|
+
// nako.logger.addListener('trace', ({ browserConsole }) => { console.log(...browserConsole) })
|
|
7
|
+
const cmp = (code, res) => {
|
|
8
|
+
nako.logger.debug('code=' + code)
|
|
9
|
+
assert.strictEqual(nako.run(code, 'main.nako3').log, res)
|
|
10
|
+
}
|
|
11
|
+
// --- test ---
|
|
12
|
+
|
|
13
|
+
it('簡単な関数定義', () => {
|
|
14
|
+
cmp('●HOGE()\n「あ」と表示\nここまで\nHOGE。', 'あ')
|
|
15
|
+
cmp('関数 HOGE()\n「あ」と表示\nここまで\nHOGE。', 'あ')
|
|
16
|
+
})
|
|
17
|
+
it('引数付き関数定義', () => {
|
|
18
|
+
cmp('●(Sの)表示処理とは\nSを表示\nここまで\n「殿」の表示処理。', '殿')
|
|
19
|
+
cmp('●(AとBの)加算処理とは;それはA+B;ここまで;3と8の加算処理して表示', '11')
|
|
20
|
+
cmp('●(AにBをCと)連続加算処理\nそれはA+B+C\nここまで\n100に20を3と連続加算処理して表示。', '123')
|
|
21
|
+
})
|
|
22
|
+
it('引数付き関数定義(互換性のため)', () => {
|
|
23
|
+
cmp('●表示処理(Sの)\nSを表示\nここまで\n「殿」の表示処理。', '殿')
|
|
24
|
+
cmp('●加算処理(AとBの);それはA+B;ここまで;3と8の加算処理して表示', '11')
|
|
25
|
+
cmp('●HOGE(Aに)\nAと表示\nここまで\n「姫」にHOGE。', '姫')
|
|
26
|
+
})
|
|
27
|
+
it('三つの引数', () => {
|
|
28
|
+
cmp('●踊る(AとBがCを)\n「{A}:{B}:{C}」と表示\nここまで\n「姫」と「殿」が「タンゴ」を踊る。', '姫:殿:タンゴ')
|
|
29
|
+
cmp('●踊る(AとBとCが)\n「{A}:{B}:{C}」と表示\nここまで\n「姫」と「殿」と「息子」が踊る。', '姫:殿:息子')
|
|
30
|
+
})
|
|
31
|
+
it('戻るのテスト', () => {
|
|
32
|
+
cmp('●加算(AにBを)\n(A+B)で戻る\nここまで\n2に3を加算して表示。', '5')
|
|
33
|
+
})
|
|
34
|
+
it('再帰テスト', () => {
|
|
35
|
+
cmp('●NN(vとlevelで)\n' +
|
|
36
|
+
'もしlevel<=0ならば、vで戻る。\n' +
|
|
37
|
+
'(v+1)と(level-1)でNN。\n' +
|
|
38
|
+
'それで戻る。\nここまで\n' +
|
|
39
|
+
'0と5でNN。それを表示。', '5')
|
|
40
|
+
})
|
|
41
|
+
it('ローカル変数1', () => {
|
|
42
|
+
cmp('N=30\n' +
|
|
43
|
+
'●テスト\n' +
|
|
44
|
+
' Nとは変数\n' +
|
|
45
|
+
' N=10\n' +
|
|
46
|
+
'ここまで\n' +
|
|
47
|
+
'テスト。\n' +
|
|
48
|
+
'Nを表示。', '30')
|
|
49
|
+
})
|
|
50
|
+
it('ローカル変数2', () => {
|
|
51
|
+
cmp('N=30\n' +
|
|
52
|
+
'●テスト\n' +
|
|
53
|
+
' Nとは変数=10\n' +
|
|
54
|
+
'ここまで\n' +
|
|
55
|
+
'テスト。\n' +
|
|
56
|
+
'Nを表示。', '30')
|
|
57
|
+
})
|
|
58
|
+
it('ローカル変数3', () => {
|
|
59
|
+
cmp('N=300\n' +
|
|
60
|
+
'●テスト(AにBを)\n' +
|
|
61
|
+
' 変数のN=A+B\n' +
|
|
62
|
+
'ここまで\n' +
|
|
63
|
+
'1に2をテスト。\n' +
|
|
64
|
+
'Nを表示。', '300')
|
|
65
|
+
})
|
|
66
|
+
it('ローカル定数1', () => {
|
|
67
|
+
cmp('定数のN=30\n' +
|
|
68
|
+
'Nを表示。', '30')
|
|
69
|
+
})
|
|
70
|
+
it('ローカル定数2', () => {
|
|
71
|
+
let nako = new NakoCompiler()
|
|
72
|
+
let expected = '30'
|
|
73
|
+
for (let i = 0; i < 2; i++) {
|
|
74
|
+
nako = nako.runEx('定数のN=30\nNを表示。', 'main.nako3', { resetLog: false })
|
|
75
|
+
assert.strictEqual(nako.log, expected)
|
|
76
|
+
expected += '\n30'
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
it('助詞の複数定義', () => {
|
|
80
|
+
cmp('●加算処理(AにBを|AとBの)\n' +
|
|
81
|
+
'(A+B)を戻す。\n' +
|
|
82
|
+
'ここまで\n' +
|
|
83
|
+
'10に20を加算処理して表示。\n' +
|
|
84
|
+
'20と10の加算処理して表示。\n', '30\n30')
|
|
85
|
+
})
|
|
86
|
+
it('それを関数の戻り値とする', () => {
|
|
87
|
+
cmp('●加算処理(AにBを|AとBの)\n' +
|
|
88
|
+
'それは、A+B。\n' +
|
|
89
|
+
'ここまで\n' +
|
|
90
|
+
'10に20を加算処理して表示。\n' +
|
|
91
|
+
'20と10の加算処理して表示。\n', '30\n30')
|
|
92
|
+
})
|
|
93
|
+
it('英語言語っぽい関数定義', () => {
|
|
94
|
+
cmp('●加算処理(A,B)\n' +
|
|
95
|
+
'それは、A+B。\n' +
|
|
96
|
+
'ここまで\n' +
|
|
97
|
+
'加算処理(10,20)を表示。\n' +
|
|
98
|
+
'加算処理(20,10)を表示。\n', '30\n30')
|
|
99
|
+
})
|
|
100
|
+
it('関数の参照渡し', () => {
|
|
101
|
+
cmp('●({関数}fで)演算処理とは\n' +
|
|
102
|
+
' それは、f()\n' +
|
|
103
|
+
'ここまで\n' +
|
|
104
|
+
'●二倍処理とは\n' +
|
|
105
|
+
' それは2\n' +
|
|
106
|
+
'ここまで\n' +
|
|
107
|
+
'二倍処理で演算処理して表示。', '2')
|
|
108
|
+
cmp('●({関数}fでaを)演算処理とは\n' +
|
|
109
|
+
' それは、f(a)\n' +
|
|
110
|
+
'ここまで\n' +
|
|
111
|
+
'●(aを)二倍処理とは\n' +
|
|
112
|
+
' それはa*2\n' +
|
|
113
|
+
'ここまで\n' +
|
|
114
|
+
'二倍処理で2を演算処理して表示。', '4')
|
|
115
|
+
cmp('●({関数}fでaとbを)演算処理とは\n' +
|
|
116
|
+
' それは、f(a,b)\n' +
|
|
117
|
+
'ここまで\n' +
|
|
118
|
+
'●(aとbを)二倍処理とは\n' +
|
|
119
|
+
' それはa*b*2\n' +
|
|
120
|
+
'ここまで\n' +
|
|
121
|
+
'二倍処理で2と3を演算処理して表示。', '12')
|
|
122
|
+
})
|
|
123
|
+
it('無名関数', () => {
|
|
124
|
+
cmp('F=関数(a,b)それはa+b;ここまで。\n' +
|
|
125
|
+
'F(3,5)を表示。\n', '8')
|
|
126
|
+
cmp('F=関数(a,b)それは(a+b);ここまで\n' +
|
|
127
|
+
'F(3,5)を表示。\n', '8')
|
|
128
|
+
cmp('(関数(a,b)それは(a+b);ここまで)をFに代入。\n' +
|
|
129
|
+
'F(1,2)を表示。\n', '3')
|
|
130
|
+
cmp('(●(a,b)それは(a+b);ここまで)をFに代入。\n' +
|
|
131
|
+
'F(1,2)を表示。\n', '3')
|
|
132
|
+
})
|
|
133
|
+
it('暗黙的な無名関数「には」', () => {
|
|
134
|
+
cmp('●(Fを)処理した時\nF()を表示\nここまで\n' +
|
|
135
|
+
'処理した時には\nそれは「OK」\nここまで。', 'OK')
|
|
136
|
+
cmp('●(fでaを)演算処理とは\nf(a)を表示\nここまで\n' +
|
|
137
|
+
'2を演算処理には(a)\nそれはa*2\nここまで\n', '4')
|
|
138
|
+
})
|
|
139
|
+
it('暗黙的な無名関数「は〜」', () => {
|
|
140
|
+
cmp('●(Fを)処理した時\nF()を表示\nここまで\n' +
|
|
141
|
+
'処理した時は〜\nそれは「OK」\nここまで。', 'OK')
|
|
142
|
+
cmp('●(fでaを)演算処理とは\nf(a)を表示\nここまで\n' +
|
|
143
|
+
'2を演算処理は~(a)\nそれはa*2\nここまで\n', '4')
|
|
144
|
+
})
|
|
145
|
+
it('**すること #936', () => {
|
|
146
|
+
cmp('●(AとBを)加算処理とは\nAとBを足すこと。。。3と5を加算処理して表示。', '8')
|
|
147
|
+
cmp('●(Nを)二乗処理とは;A=0;N回,AにNを足してAに代入すること。それはA。。。5を二乗処理して表示。', '25')
|
|
148
|
+
})
|
|
149
|
+
})
|