nadesiko3 3.3.63 → 3.3.64

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 (44) hide show
  1. package/batch/command.txt +15 -15
  2. package/core/package.json +4 -1
  3. package/core/src/nako3.mjs +5 -2
  4. package/core/src/nako3.mts +5 -4
  5. package/core/src/nako_core_version.mjs +2 -2
  6. package/core/src/nako_core_version.mts +2 -2
  7. package/core/src/nako_from_dncl.mjs +0 -254
  8. package/core/src/nako_from_dncl.mts +0 -247
  9. package/core/src/nako_from_dncl2.mjs +313 -0
  10. package/core/src/nako_from_dncl2.mts +299 -0
  11. package/core/src/nako_gen.mjs +1 -1
  12. package/core/src/nako_gen.mts +1 -1
  13. package/core/src/nako_indent_inline.mjs +152 -34
  14. package/core/src/nako_indent_inline.mts +132 -34
  15. package/core/src/nako_lex_rules.mjs +3 -2
  16. package/core/src/nako_lex_rules.mts +3 -2
  17. package/core/src/nako_lexer.mjs +27 -3
  18. package/core/src/nako_lexer.mts +27 -3
  19. package/core/src/nako_parser3.mjs +45 -14
  20. package/core/src/nako_parser3.mts +40 -18
  21. package/core/src/nako_prepare.mjs +13 -0
  22. package/core/src/nako_prepare.mts +11 -0
  23. package/core/src/nako_tools.mjs +53 -0
  24. package/core/src/nako_tools.mts +46 -0
  25. package/core/test/basic_test.mjs +16 -8
  26. package/core/test/dncl2_test.mjs +207 -0
  27. package/core/test/flow_test.mjs +42 -0
  28. package/core/test/indent_test.mjs +74 -50
  29. package/core/test/inline_indent_test.mjs +47 -0
  30. package/core/test/lex_test.mjs +1 -0
  31. package/demo/js/a.js +30 -0
  32. package/package.json +1 -1
  33. package/release/_hash.txt +16 -16
  34. package/release/_script-tags.txt +14 -14
  35. package/release/nako_gen_async.js +1 -1
  36. package/release/stats.json +1 -1
  37. package/release/version.js +1 -1
  38. package/release/wnako3.js +1 -1
  39. package/release/wnako3webworker.js +1 -1
  40. package/src/cnako3mod.mjs +43 -33
  41. package/src/cnako3mod.mts +45 -35
  42. package/src/nako_version.mjs +2 -2
  43. package/src/nako_version.mts +2 -2
  44. package/src/plugin_browser_canvas.mjs +5 -0
@@ -198,6 +198,7 @@ export class NakoPrepare {
198
198
  if (flagStr2) {
199
199
  if (ch2 === endOfStr) {
200
200
  flagStr2 = false
201
+ if (endOfStr === '*/') { endOfStr = '*/' } // 強制変換
201
202
  res.push(new ConvertResult(str + endOfStr, src.getSourcePosition(left)))
202
203
  i += 2
203
204
  left = i
@@ -275,6 +276,16 @@ export class NakoPrepare {
275
276
  str = ''
276
277
  continue
277
278
  }
279
+ // 複数行コメント内を飛ばす
280
+ if (ch2 === '/*') {
281
+ res.push(new ConvertResult('/*', src.getSourcePosition(left))) // 強制変換
282
+ i += 2
283
+ left = i
284
+ flagStr2 = true
285
+ endOfStr = '*/'
286
+ str = ''
287
+ continue
288
+ }
278
289
  // 複数行コメント内を飛ばす (#731)
279
290
  if (ch2 === '/*') {
280
291
  res.push(new ConvertResult(ch2, src.getSourcePosition(left)))
@@ -0,0 +1,53 @@
1
+ /**
2
+ * よく使う処理をまとめたもの
3
+ */
4
+ import { NewEmptyToken } from './nako_types.mjs';
5
+ /**
6
+ * トークンの内容をデバッグ出力する関数
7
+ * @param tokens トークンの一覧
8
+ * @returns 文字列
9
+ */
10
+ export function debugTokens(tokens) {
11
+ const result = [];
12
+ for (let i = 0; i < tokens.length; i++) {
13
+ const t = tokens[i];
14
+ const ftype = t.type;
15
+ const fvalue = t.value;
16
+ let s = `[${ftype}:${fvalue}]`;
17
+ if (ftype === fvalue) {
18
+ s = ftype;
19
+ }
20
+ if (ftype === 'comma') {
21
+ s = ',';
22
+ }
23
+ if (ftype === 'string') {
24
+ s = `"${fvalue}"`;
25
+ }
26
+ if (ftype === 'number') {
27
+ s = `(${fvalue})`;
28
+ }
29
+ if (ftype === 'word') {
30
+ s = `[word:${fvalue}]`;
31
+ }
32
+ if (!result[t.line]) {
33
+ result[t.line] = makeIndent(t.indent);
34
+ }
35
+ result[t.line] += s + t.josi + '|';
36
+ }
37
+ return result.join('\n');
38
+ }
39
+ export function makeIndent(n) {
40
+ let s = '';
41
+ for (let i = 0; i < n; i++) {
42
+ s += ' ';
43
+ }
44
+ return s;
45
+ }
46
+ let lastTokenInfo = NewEmptyToken();
47
+ export function newToken(type, value, templateToken = undefined) {
48
+ if (templateToken) {
49
+ lastTokenInfo = templateToken;
50
+ }
51
+ const t = NewEmptyToken(type, value, lastTokenInfo.indent, lastTokenInfo.line, lastTokenInfo.file);
52
+ return t;
53
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * よく使う処理をまとめたもの
3
+ */
4
+ import { Token, NewEmptyToken } from './nako_types.mjs'
5
+
6
+ /**
7
+ * トークンの内容をデバッグ出力する関数
8
+ * @param tokens トークンの一覧
9
+ * @returns 文字列
10
+ */
11
+ export function debugTokens (tokens: Token[]) {
12
+ const result = []
13
+ for (let i = 0; i < tokens.length; i++) {
14
+ const t = tokens[i]
15
+ const ftype = t.type
16
+ const fvalue = t.value
17
+ let s = `[${ftype}:${fvalue}]`
18
+ if (ftype === fvalue) { s = ftype }
19
+ if (ftype === 'comma') { s = ',' }
20
+ if (ftype === 'string') { s = `"${fvalue}"` }
21
+ if (ftype === 'number') { s = `(${fvalue})` }
22
+ if (ftype === 'word') { s = `[word:${fvalue}]` }
23
+ if (!result[t.line]) {
24
+ result[t.line] = makeIndent(t.indent)
25
+ }
26
+ result[t.line] += s + t.josi + '|'
27
+ }
28
+ return result.join('\n')
29
+ }
30
+
31
+ export function makeIndent (n: number): string {
32
+ let s = ''
33
+ for (let i = 0; i < n; i++) {
34
+ s += ' '
35
+ }
36
+ return s
37
+ }
38
+
39
+ let lastTokenInfo = NewEmptyToken()
40
+ export function newToken (type: string, value: any, templateToken: Token|undefined = undefined): Token {
41
+ if (templateToken) {
42
+ lastTokenInfo = templateToken
43
+ }
44
+ const t = NewEmptyToken(type, value, lastTokenInfo.indent, lastTokenInfo.line, lastTokenInfo.file)
45
+ return t
46
+ }
@@ -244,14 +244,14 @@ describe('basic', async () => {
244
244
  await cmp('時間=1\n(時間)を表示', '1')
245
245
  })
246
246
  it('「もしFが存在するならば」がFと「存在する」の比較になる問題の修正 #830', async () => {
247
- await cmp('●(Aが)hogeとは\n' +
248
- ' 1を戻す\n' +
249
- 'ここまで\n' +
250
- 'もし、Fがhogeならば\n' +
251
- ' 1を表示\n' +
252
- 'ここまで',
253
- // ---
254
- '1')
247
+ await cmp(
248
+ '●(Aが)hogeとは\n' +
249
+ ' 1を戻す\n' +
250
+ 'ここまで\n' +
251
+ 'もし、Fがhogeならば\n' +
252
+ ' 1を表示\n' +
253
+ 'ここまで',
254
+ '1')
255
255
  })
256
256
  it('無名関数が警告を出す問題の修正 #841', async () => {
257
257
  let log = ''
@@ -339,4 +339,12 @@ describe('basic', async () => {
339
339
  await cmp('Aを3増やす;Aと表示;', '3')
340
340
  await cmp('Aを3減らす;Aと表示;', '-3')
341
341
  })
342
+ it('文字列記号と全角コメント閉じ記号の組み合わせがある時うまく動いていない(core #45)', async () => {
343
+ await cmp(
344
+ 'もし1ならば\n' +
345
+ '  1を表示 /* 「 */\n' +
346
+ '  2を表示\n' +
347
+ 'ここまで。\n' +
348
+ '', '1\n2')
349
+ })
342
350
  })
@@ -0,0 +1,207 @@
1
+ /* eslint-disable no-undef */
2
+ import assert from 'assert'
3
+ import { NakoCompiler } from '../src/nako3.mjs'
4
+
5
+ describe('dncl2 (core #41)', async () => {
6
+ const cmp = async (code, res) => {
7
+ const nako = new NakoCompiler()
8
+ const g = await nako.runAsync(code)
9
+ const resultValue = g.log
10
+ // console.log(resultValue, '=', res)
11
+ assert.strictEqual(resultValue, res)
12
+ }
13
+
14
+ it('基本', async () => {
15
+ await cmp('!DNCL2\n' +
16
+ 'A=3\nAを表示', '3')
17
+ })
18
+ it('繰り返し文([繰り返す]なし)', async () => {
19
+ await cmp('!DNCL2\n' +
20
+ 'C=0\n' +
21
+ 'Iを1から10まで1ずつ増やしながら:\n' +
22
+ '  C=C+I\n' +
23
+ 'Cを表示', '55')
24
+ await cmp('!DNCL2\n' +
25
+ 'C=10\n' +
26
+ 'Iを1から10まで1ずつ減らしながら:\n' +
27
+ '  C=C-1\n' +
28
+ 'Cを表示', '0')
29
+ })
30
+ it('繰り返し文([繰り返す]あり)', async () => {
31
+ await cmp('!DNCL2\n' +
32
+ 'C=0\n' +
33
+ 'Iを1から10まで1ずつ増やしながら繰り返す:\n' +
34
+ '  C=C+I\n' +
35
+ 'Cを表示', '55')
36
+ await cmp('!DNCL2\n' +
37
+ 'C=10\n' +
38
+ 'Iを1から10まで1ずつ減らしながら繰り返す:\n' +
39
+ '  C=C-1\n' +
40
+ 'Cを表示', '0')
41
+ await cmp('!DNCL2\n' +
42
+ 'C=0\n' +
43
+ 'm を 1 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
44
+ '  C=C+1\n' +
45
+ 'Cを表示', '3')
46
+ })
47
+ it('もし文', async () => {
48
+ await cmp('!DNCL2\n' +
49
+ 'C=0\n' +
50
+ 'もし、C != 1ならば:\n' +
51
+ '  「OK」を表示。\n' +
52
+ 'そうでなければ:\n' +
53
+ '  「NG」を表示。\n' +
54
+ '', 'OK')
55
+ await cmp('' +
56
+ '!DNCL2\n' +
57
+ 'C=2\n' +
58
+ 'もし、C == 1ならば:\n' +
59
+ '  「NG」を表示。\n' +
60
+ 'そうでなければ、もし、C==2ならば:\n' +
61
+ '  「OK」を表示。\n' +
62
+ 'そうでなければ、もし、C==3ならば:\n' +
63
+ '  「NG」を表示。\n' +
64
+ '', 'OK')
65
+ })
66
+ it('もし文(ネスト)', async () => {
67
+ await cmp('!DNCL2\n' +
68
+ 'A=1;B=1\n' +
69
+ 'もし、A == 1ならば:\n' +
70
+ '  もし、B==1ならば:\n' +
71
+ '    「11」と表示\n' +
72
+ '  そうでなければ:\n' +
73
+ '    「NG」を表示。\n' +
74
+ 'そうでなければ:\n' +
75
+ '  「NG」を表示\n' +
76
+ '', '11')
77
+ await cmp('!DNCL2\n' +
78
+ 'A=1;B=0\n' +
79
+ 'もし、A == 1ならば:\n' +
80
+ '  もし、B==1ならば:\n' +
81
+ '    「11」と表示\n' +
82
+ '  そうでなければ:\n' +
83
+ '    「OK」を表示。\n' +
84
+ 'そうでなければ:\n' +
85
+ '  「A!=1」を表示\n' +
86
+ '', 'OK')
87
+ })
88
+ it('繰り返し文(ネスト)', async () => {
89
+ await cmp('!DNCL2\n' +
90
+ 'C=""\n' +
91
+ 'Iを0から4まで1ずつ増やしながら繰り返す:\n' +
92
+ '  もし、I%2 == 0ならば:\n' +
93
+ '    C = C & I\n' +
94
+ 'Cを表示;', '024')
95
+ //
96
+ await cmp('!DNCL2\n' +
97
+ 'C=""\n' +
98
+ 'Yを0から1まで1ずつ増やしながら繰り返す:\n' +
99
+ '  Xを0から1まで1ずつ増やしながら繰り返す:\n' +
100
+ '    C=C&"Y{Y}X{X}"\n' +
101
+ 'Cを表示;', 'Y0X0Y0X1Y1X0Y1X1')
102
+ })
103
+ it('記号でインデント', async () => {
104
+ await cmp('!DNCL2\n' +
105
+ 'C=0\n' +
106
+ 'もし、C != 1ならば:\n' +
107
+ '⎿「OK」を表示。\n' +
108
+ 'そうでなければ:\n' +
109
+ '⎿「NG」を表示。\n', 'OK')
110
+ await cmp('!DNCL2\n' +
111
+ 'C=2\n' +
112
+ 'もし、C == 1ならば:\n' +
113
+ '│└「NG」を表示。\n' +
114
+ 'そうでなければ、もし、C==2ならば:\n' +
115
+ '│└「OK」を表示。\n' +
116
+ 'そうでなければ、もし、C==3ならば:\n' +
117
+ '│└「NG」を表示。\n' +
118
+ '', 'OK')
119
+ })
120
+ it('記号でインデント2', async () => {
121
+ await cmp('!DNCL2\n' +
122
+ 'C=0\n' +
123
+ 'もし、C != 1ならば:\n' +
124
+ '| 「OK」を表示。\n' +
125
+ 'そうでなければ:\n' +
126
+ '| 「NG」を表示。\n' +
127
+ '', 'OK')
128
+ await cmp('!DNCL2\n' +
129
+ 'C=2\n' +
130
+ 'もし、C == 1ならば:\n' +
131
+ '⎿ 「NG」を表示。\n' +
132
+ 'そうでなければ、もし、C==2ならば:\n' +
133
+ '⎿ 「OK」を表示。\n' +
134
+ 'そうでなければ、もし、C==3ならば:\n' +
135
+ '⎿ 「NG」を表示。\n' +
136
+ '', 'OK')
137
+ })
138
+ it('配列の初期化', async () => {
139
+ await cmp('!DNCL2\n' +
140
+ '配列 Hindo のすべての要素に 10 を代入する\n' +
141
+ 'Hindo[0]を表示\n', '10')
142
+ await cmp('!DNCL2\n' +
143
+ '配列変数 Hirabun を初期化する\n' +
144
+ 'Hirabun[3]を表示\n', '0')
145
+ await cmp('!DNCL2\n' +
146
+ 'Totuzen[3]=30\n' +
147
+ 'Totuzen[3]を表示\n', '30')
148
+ await cmp('!DNCL2\n' +
149
+ '配列 Hindo のすべての値に 55 を代入\n' +
150
+ 'Hindo[0]を表示\n', '55')
151
+ })
152
+ it('「情報」試作問題 (検討用イメージ)', async () => {
153
+ await cmp(
154
+ '!DNCL2\n' +
155
+ 'Angoubun = ["a","b"," ","a"]\n' +
156
+ '配列 Hindo のすべての要素に 0 を代入する\n' +
157
+ 'i を 0 から (要素数(Angoubun)-1) まで 1 ずつ増やしながら:\n' +
158
+ '  bangou = 差分( Angoubun[i] )\n' +
159
+ '  もし,bangou != -1ならば:\n' +
160
+ '    Hindo[bangou] = Hindo[bangou] + 1\n' +
161
+ 'Hindoの0から3を配列取り出して、Hindoに代入。\n' +
162
+ '表示する(Hindo)\n' +
163
+ '●差分(CH)とは:\n' +
164
+ '  A=ASC("a"); Z=ASC("z"); C=ASC(CH)\n' +
165
+ '  もし、(A<=C)かつ(C<=Z)ならば、(C-A)を戻す。\n' +
166
+ '  それは-1\n' +
167
+ '\n', '2,1,0')
168
+ })
169
+ it('「情報」サンプル問題-当選数を決めるプログラム2', async () => {
170
+ await cmp('' +
171
+ '!DNCL2\n' +
172
+ 'Tomei = ["A党", "B党", "C党", "D党"]\n' +
173
+ 'Tokuhyo = [1200, 660, 1440, 180]\n' +
174
+ 'sousuu = 0\n' +
175
+ 'giseki = 6\n' +
176
+ 'm を 0 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
177
+ '⎿ sousuu = sousuu + Tokuhyo[m]\n' +
178
+ 'kizyunsuu = sousuu / giseki\n' +
179
+ 'm を 0 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
180
+ '⎿ 表示する(Tomei[m], ":", Tokuhyo[m] / kizyunsuu)\n' +
181
+ '\n', 'A党:2.0689655172413794\nB党:1.1379310344827587\nC党:2.4827586206896552\nD党:0.3103448275862069')
182
+ })
183
+ it('「情報」サンプル問題-当選数を決めるプログラム2改', async () => {
184
+ await cmp('' +
185
+ '!DNCL2\n' +
186
+ 'Tomei = ["A党", "B党", "C党", "D党"]\n' +
187
+ 'Tokuhyo = [1200, 660, 1440, 180]\n' +
188
+ 'Koho = [5, 4, 2, 3]\n' +
189
+ 'Tosen = [0, 0, 0, 0]\n' +
190
+ 'tosenkei = 0\n' +
191
+ 'giseki = 6\n' +
192
+ 'm を 0 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
193
+ '⎿ Hikaku[m] = Tokuhyo[m]\n' +
194
+ 'tosenkei < giseki の間繰り返す:\n' +
195
+ '| max = 0\n' +
196
+ '| i を 0 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
197
+ '| | もし max < Hikaku[i] and Koho[i] >= Tosen[i] + 1 ならば:\n' +
198
+ '| | | max = Hikaku[i]\n' +
199
+ '| ⎿ ⎿ maxi = i\n' +
200
+ '| Tosen[maxi] = Tosen[maxi] + 1\n' +
201
+ '| tosenkei = tosenkei + 1\n' +
202
+ '⎿ Hikaku[maxi] = 切り捨て(Tokuhyo[maxi] / tosenkei)\n' +
203
+ 'k を 0 から 3 まで 1 ずつ増やしながら繰り返す:\n' +
204
+ '⎿ 表示する(Tomei[k], ":", Tosen[k], "名")\n' +
205
+ '', 'A党:3名\nB党:1名\nC党:2名\nD党:0名')
206
+ })
207
+ })
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-undef */
1
2
  import assert from 'assert'
2
3
  import { NakoCompiler } from '../src/nako3.mjs'
3
4
 
@@ -370,4 +371,45 @@ describe('flow_test', async () => {
370
371
  it('ならばの直前に空白があるとエラー(#1141)', async () => {
371
372
  await cmp('A=30。もし、A>5 ならば、「OK」と表示。', 'OK')
372
373
  })
374
+ it('-1を含む「もし」文が動かない core #47', async () => {
375
+ await cmp(
376
+ 'A=0; もし、A != -1ならば\n' +
377
+ '  「あ」と表示\n' +
378
+ 'ここまで\n' +
379
+ '', 'あ')
380
+ })
381
+ it('「もし」...「でなければ」', async () => {
382
+ await cmp(
383
+ 'A=0; もし、A==-1でなければ\n' +
384
+ '  「あ」と表示\n' +
385
+ 'ここまで\n' +
386
+ '', 'あ')
387
+ await cmp(
388
+ 'A=0; もし、INT(A)==-1でなければ\n' +
389
+ '  「あ」と表示\n' +
390
+ 'ここまで\n' +
391
+ '', 'あ')
392
+ await cmp(
393
+ 'A=0; もし、Aが-1でなければ\n' +
394
+ '  「あ」と表示\n' +
395
+ 'ここまで\n' +
396
+ '', 'あ')
397
+ await cmp(
398
+ 'A=0; もし、Aが-5以下でなければ\n' +
399
+ '  「あ」と表示\n' +
400
+ 'ここまで\n' +
401
+ '', 'あ')
402
+ })
403
+ it('「もし」AがBならば', async () => {
404
+ await cmp(
405
+ 'A=0; もし、Aが0ならば\n' +
406
+ '  「あ」と表示\n' +
407
+ 'ここまで\n' +
408
+ '', 'あ')
409
+ await cmp(
410
+ 'A=0; もし、INT(A)が0ならば\n' +
411
+ '  「あ」と表示\n' +
412
+ 'ここまで\n' +
413
+ '', 'あ')
414
+ })
373
415
  })
@@ -1,47 +1,49 @@
1
+ /* eslint-disable no-undef */
1
2
  import assert from 'assert'
2
3
  import { NakoCompiler } from '../src/nako3.mjs'
3
4
  import NakoIndent from '../src/nako_indent.mjs'
4
5
 
5
- describe('indent', () => {
6
+ describe('indent', async () => {
6
7
  const cmp = async (/** @type {string} */ code, /** @type {string} */ res) => {
7
8
  const nako = new NakoCompiler()
8
- assert.strictEqual((nako.runSync(code)).log, res)
9
+ const g = await nako.runAsync(code)
10
+ assert.strictEqual(g.log, res)
9
11
  }
10
- it('もし', () => {
11
- cmp('!インデント構文\n' +
12
+ it('もし', async () => {
13
+ await cmp('!インデント構文\n' +
12
14
  'もし1=1ならば\n' +
13
15
  '  1を表示\n', '1')
14
- cmp('!インデント構文\n' +
16
+ await cmp('!インデント構文\n' +
15
17
  'もし1=1ならば\n' +
16
18
  '  「わん」と表示。\n', 'わん')
17
19
  })
18
- it('もし 違えば', () => {
19
- cmp('!インデント構文\n' +
20
+ it('もし 違えば', async () => {
21
+ await cmp('!インデント構文\n' +
20
22
  'A=1\nもしA=1ならば\n' +
21
23
  '  1を表示\n' +
22
24
  '違えば\n' +
23
25
  '  2を表示\n', '1')
24
- cmp('!インデント構文\n' +
26
+ await cmp('!インデント構文\n' +
25
27
  'A=2\nもしA=1ならば\n' +
26
28
  '  1を表示\n' +
27
29
  '違えば\n' +
28
30
  '  2を表示\n', '2')
29
31
  })
30
- it('5回', () => {
31
- cmp('!インデント構文\n' +
32
+ it('5回', async () => {
33
+ await cmp('!インデント構文\n' +
32
34
  'N=0;5回\n' +
33
35
  '    N=N+1\n' +
34
36
  'Nを表示;', '5')
35
37
  })
36
- it('3回と5回', () => {
37
- cmp('!インデント構文\n' +
38
+ it('3回と5回', async () => {
39
+ await cmp('!インデント構文\n' +
38
40
  'N=0;5回\n' +
39
41
  '  3回\n' +
40
42
  '    N=N+1\n' +
41
43
  'Nを表示;', '15')
42
44
  })
43
- it('もし 違えば 入れ子', () => {
44
- cmp('!インデント構文\n' +
45
+ it('もし 違えば 入れ子', async () => {
46
+ await cmp('!インデント構文\n' +
45
47
  'A=1;B=1;もしA=1ならば\n' +
46
48
  '  もしB=1ならば\n' +
47
49
  '    1を表示\n' +
@@ -49,7 +51,7 @@ describe('indent', () => {
49
51
  '    2を表示\n' +
50
52
  '違えば\n' +
51
53
  '  3を表示\n', '1')
52
- cmp('!インデント構文\n' +
54
+ await cmp('!インデント構文\n' +
53
55
  'A=2;B=1;もしA=1ならば\n' +
54
56
  '  もしB=1ならば\n' +
55
57
  '    1を表示\n' +
@@ -58,12 +60,26 @@ describe('indent', () => {
58
60
  '違えば\n' +
59
61
  '  3を表示\n', '3')
60
62
  })
61
- it('JSONで改行がある場合(#699)', () => {
62
- cmp('!インデント構文\n' +
63
- 'J={"taro":30,\n' +
64
- ' "jiro":50}\n' +
65
- 'J@"jiro"を表示', 50)
66
- cmp('!インデント構文\n' +
63
+ it('JSONで改行がある場合(#699)(core #46)', async () => {
64
+ await cmp(
65
+ '!インデント構文\n' +
66
+ 'J={"taro":30,\n' +
67
+ '  "jiro":50}\n' +
68
+ 'J@"jiro"を表示\n' +
69
+ '', '50')
70
+ await cmp('' +
71
+ '!インデント構文\n' +
72
+ 'A=[99]\nもしA[0]=99ならば\n' +
73
+ '  A=[0,\n0]\n' +
74
+ 'A[0]を表示\n', '0')
75
+ await cmp('' +
76
+ '!インデント構文\n' +
77
+ 'A={"a":0,"b":0}\nもし1ならば\n' +
78
+ '  A={"a":99,\n"b":99}\n' +
79
+ 'A["b"]を表示\n', '99')
80
+ })
81
+ it('文字列内に改行がある場合', async () => {
82
+ await cmp('!インデント構文\n' +
67
83
  'S=「aaa\n' +
68
84
  'bbb」\n' +
69
85
  'もしS=30ならば\n' +
@@ -71,58 +87,58 @@ describe('indent', () => {
71
87
  '違えば\n' +
72
88
  '  「o」と表示', 'o')
73
89
  })
74
- it('コメント内に文字列リテラルの開始記号がある場合', () => {
75
- cmp('!インデント構文\n' +
90
+ it('コメント内に文字列リテラルの開始記号がある場合', async () => {
91
+ await cmp('!インデント構文\n' +
76
92
  'A=9;もしA=1ならば\n' +
77
93
  '  1を表示 # 「\n' +
78
94
  '2を表示\n', '2')
79
- cmp('!インデント構文\n' +
95
+ await cmp('!インデント構文\n' +
80
96
  'A=1;もしA=1ならば\n' +
81
97
  '  1を表示 // 「\n' +
82
98
  '2を表示\n', '1\n2')
83
99
  })
84
- it('複数行コメント内に文字列リテラルの開始記号がある場合', () => {
85
- cmp('!インデント構文\n' +
100
+ it('複数行コメント内に文字列リテラルの開始記号がある場合', async () => {
101
+ await cmp('!インデント構文\n' +
86
102
  'A=9;もしA=1ならば\n' +
87
103
  '  1を表示 /* 「 */\n' +
88
104
  '2を表示\n', '2')
89
- cmp('!インデント構文\n' +
105
+ await cmp('!インデント構文\n' +
90
106
  'A=1;もしA=1ならば\n' +
91
107
  '  1を表示 /* 「 */\n' +
92
108
  '2を表示\n', '1\n2')
93
109
  })
94
- it('改行を含む、絵文字による文字列がある場合', () => {
95
- cmp(
96
- '!インデント構文\n' +
97
- '2回\n' +
98
- ' 🌴1\n' +
99
- '🌴を表示\n' +
100
- '「2」を表示\n', '1\n1\n2')
110
+ it('改行を含む、絵文字による文字列がある場合', async () => {
111
+ await cmp(
112
+ '!インデント構文\n' +
113
+ '2回\n' +
114
+ ' 🌴1\n' +
115
+ '🌴を表示\n' +
116
+ '「2」を表示\n', '1\n\n1\n\n2')
101
117
  })
102
- it('前後が一致しない括弧がある場合', () => {
103
- cmp('!インデント構文\n' +
118
+ it('前後が一致しない括弧がある場合', async () => {
119
+ await cmp('!インデント構文\n' +
104
120
  '2回\n' +
105
121
  ' A={\n' +
106
122
  '}\n' +
107
123
  '1を表示\n', '1')
108
124
  })
109
- it('「違えば」に行コメントがある場合', () => {
110
- cmp('!インデント構文\n' +
125
+ it('「違えば」に行コメントがある場合', async () => {
126
+ await cmp('!インデント構文\n' +
111
127
  'A=2;もしA=1ならば\n' +
112
128
  '  1を表示\n' +
113
129
  '違えば # コメント\n' +
114
130
  '  2を表示\n', '2')
115
131
  })
116
- it('「違えば」に範囲コメントがある場合', () => {
117
- cmp('!インデント構文\n' +
132
+ it('「違えば」に範囲コメントがある場合', async () => {
133
+ await cmp('!インデント構文\n' +
118
134
  'A=2;もしA=1ならば\n' +
119
135
  '  1を表示\n' +
120
136
  '/* foo \n' +
121
137
  '*/違えば /* bar */\n' +
122
138
  '  2を表示\n', '2')
123
139
  })
124
- it('コメントのみの行がある場合', () => {
125
- cmp('!インデント構文\n' +
140
+ it('コメントのみの行がある場合', async () => {
141
+ await cmp('!インデント構文\n' +
126
142
  'A=2;もしA=1ならば\n' +
127
143
  '    # コメント\n' +
128
144
  '  1を表示\n' +
@@ -131,16 +147,16 @@ describe('indent', () => {
131
147
  '/* */ \n' +
132
148
  '  2を表示\n', '2')
133
149
  })
134
- it('"・"がある場合', () => {
135
- cmp('!インデント構文\n' +
150
+ it('"・"がある場合', async () => {
151
+ await cmp('!インデント構文\n' +
136
152
  '1回\n' +
137
153
  '・1回\n' +
138
154
  '・・1を表示\n' +
139
155
  '・\n' +
140
156
  '・・2を表示\n', '1\n2')
141
157
  })
142
- it('「違えばもし」の場合(#940)', () => {
143
- cmp('!インデント構文\n' +
158
+ it('「違えばもし」の場合(#940)', async () => {
159
+ await cmp('!インデント構文\n' +
144
160
  'A=2;もしA=1ならば\n' +
145
161
  '  1を表示\n' +
146
162
  '違えば、もしA=2ならば\n' +
@@ -149,7 +165,7 @@ describe('indent', () => {
149
165
  '  3を表示\n', '2')
150
166
  })
151
167
  // #1269 によりソースマップの確認は不要になりつつある
152
- it('ソースマップ', () => {
168
+ it('ソースマップ', async () => {
153
169
  const result = NakoIndent.convert(
154
170
  '!インデント構文\n' +
155
171
  '\n' +
@@ -198,7 +214,7 @@ describe('indent', () => {
198
214
  { lineNumber: 13, len: 0 }
199
215
  ])
200
216
  })
201
- it('ブロック構造の取得', () => {
217
+ it('ブロック構造の取得', async () => {
202
218
  assert.deepStrictEqual(
203
219
  NakoIndent.getBlockStructure(
204
220
  'もしはいならば\n' +
@@ -214,7 +230,7 @@ describe('indent', () => {
214
230
  }
215
231
  )
216
232
  })
217
- it('ブロック構造の取得 - 複数行にまたがる構文', () => {
233
+ it('ブロック構造の取得 - 複数行にまたがる構文', async () => {
218
234
  // 複数行にまたがる文の2行目以降のインデントは、先頭行のインデントと等しいものとする。
219
235
  // コメントのみの行のインデントは、直近の通常の行のインデントと等しいものとする。
220
236
  assert.deepStrictEqual(
@@ -234,7 +250,7 @@ describe('indent', () => {
234
250
  }
235
251
  )
236
252
  })
237
- it('ブロック構造の取得 - 違えば', () => {
253
+ it('ブロック構造の取得 - 違えば', async () => {
238
254
  assert.deepStrictEqual(
239
255
  NakoIndent.getBlockStructure(
240
256
  'もしはいならば\n' +
@@ -246,4 +262,12 @@ describe('indent', () => {
246
262
  [[0, 2], [2, 4]]
247
263
  )
248
264
  })
265
+ it('2つ目の関数の定義が失敗する(#40)', async () => {
266
+ await cmp('!インデント構文\n' +
267
+ '●AAAとは\n' +
268
+ '  それは30\n' +
269
+ '●BBBとは\n' +
270
+ '  それは50\n' +
271
+ 'BBBを表示。', '50')
272
+ })
249
273
  })