From 8e0f5993f12a590c42dfebfbc99b75dba00daf15 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Mon, 28 Feb 2022 13:41:15 +0100 Subject: Make loops and functions react to control flow --- tests/typ/code/break-continue.typ | 44 ++++++++++++++++++++++++++++++++++++++- tests/typ/code/return.typ | 11 ++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) (limited to 'tests/typ/code') diff --git a/tests/typ/code/break-continue.typ b/tests/typ/code/break-continue.typ index 2b38cf77..e54651f1 100644 --- a/tests/typ/code/break-continue.typ +++ b/tests/typ/code/break-continue.typ @@ -2,13 +2,55 @@ // Ref: false --- +// Test break. + +#let error = false +#let var = 0 + #for i in range(10) { + var += i if i > 5 { - // Error: 5-10 break is not yet implemented break + error = true + } +} + +#test(error, false) +#test(var, 21) + +--- +// Test continue. + +#let x = 0 +#let i = 0 + +#while x < 8 { + i += 1 + + if mod(i, 3) == 0 { + continue } + x += i } +// If continue did not work, this would equal 10. +#test(x, 12) + +--- +// Test break outside of loop. + +#let f() = { + // Error: 3-8 cannot break outside of loop + break +} +#f() + +--- +// Test continue outside of loop. + +// Error: 12-20 cannot continue outside of loop +#let x = { continue } + --- // Error: 1-10 unexpected keyword `continue` #continue diff --git a/tests/typ/code/return.typ b/tests/typ/code/return.typ index bd30c46f..46ff190c 100644 --- a/tests/typ/code/return.typ +++ b/tests/typ/code/return.typ @@ -3,8 +3,15 @@ --- #let f(x) = { - // Error: 3-15 return is not yet implemented return x + 1 } -#f(1) +#test(f(1), 2) + +--- +// Test return outside of function. + +#for x in range(5) { + // Error: 3-9 cannot return outside of function + return +} -- cgit v1.2.3 From 4f09233bdae8f79ebafed43e8135f1a0285bd370 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Mon, 28 Feb 2022 14:36:02 +0100 Subject: Enable join collection for control flow constructs --- tests/typ/code/break-continue.typ | 37 ++++++++++++++++++++++++++++++++---- tests/typ/code/return.typ | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 4 deletions(-) (limited to 'tests/typ/code') diff --git a/tests/typ/code/break-continue.typ b/tests/typ/code/break-continue.typ index e54651f1..60dac44d 100644 --- a/tests/typ/code/break-continue.typ +++ b/tests/typ/code/break-continue.typ @@ -4,8 +4,8 @@ --- // Test break. -#let error = false #let var = 0 +#let error = false #for i in range(10) { var += i @@ -15,18 +15,32 @@ } } -#test(error, false) #test(var, 21) +#test(error, false) + +--- +// Test joining with break. + +#let i = 0 +#let x = while true { + i += 1 + str(i) + if i >= 5 { + "." + break + } +} + +#test(x, "12345.") --- // Test continue. -#let x = 0 #let i = 0 +#let x = 0 #while x < 8 { i += 1 - if mod(i, 3) == 0 { continue } @@ -36,6 +50,20 @@ // If continue did not work, this would equal 10. #test(x, 12) +--- +// Test joining with continue. + +#let x = for i in range(5) { + "a" + if mod(i, 3) == 0 { + "_" + continue + } + str(i) +} + +#test(x, "a_a1a2a_a4") + --- // Test break outside of loop. @@ -43,6 +71,7 @@ // Error: 3-8 cannot break outside of loop break } + #f() --- diff --git a/tests/typ/code/return.typ b/tests/typ/code/return.typ index 46ff190c..9ee3aed7 100644 --- a/tests/typ/code/return.typ +++ b/tests/typ/code/return.typ @@ -2,12 +2,52 @@ // Ref: false --- +// Test return with value. #let f(x) = { return x + 1 } #test(f(1), 2) +--- +// Test return with joining. + +#let f(x) = { + "a" + if x == 0 { + return "b" + } else if x == 1 { + "c" + } else { + "d" + return + "e" + } +} + +#test(f(0), "b") +#test(f(1), "ac") +#test(f(2), "ad") + +--- +// Test return with joining and template. +// Ref: true + +#let f(text, caption: none) = { + text + if caption == none { + [\.] + return + } + [, ] + emph(caption) + [\.] +} + +#f(caption: [with caption])[My figure] + +#f[My other figure] + --- // Test return outside of function. -- cgit v1.2.3