123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- discard """
- output:
- '''
- Not found!
- Found!
- 1
- compiles for 1
- i am always two
- default for 3
- set is 4 not 5
- array is 6 not 7
- default for 8
- an identifier
- OK
- OK
- OK
- ayyydd
- '''
- """
- block arrayconstr:
- const md_extension = [".md", ".markdown"]
- proc test(ext: string) =
- case ext
- of ".txt", md_extension:
- echo "Found!"
- else:
- echo "Not found!"
- test(".something")
- # ensure it's not evaluated at compile-time:
- var foo = ".markdown"
- test(foo)
- converter toInt(x: char): int =
- x.int
- block t8333:
- case 0
- of 'a': echo 0
- else: echo 1
- block: # issue #11422
- var c: int = 5
- case c
- of 'a' .. 'c': discard
- else: discard
- block emptyset_when:
- proc whenCase(a: int) =
- case a
- of (when compiles(whenCase(1)): 1 else: {}): echo "compiles for 1"
- of {}: echo "me not fail"
- of 2: echo "i am always two"
- of []: echo "me neither"
- of {4,5}: echo "set is 4 not 5"
- of [6,7]: echo "array is 6 not 7"
- of (when compiles(neverCompilesIBet()): 3 else: {}): echo "compiles for 3"
- #of {},[]: echo "me neither"
- else: echo "default for ", a
- whenCase(1)
- whenCase(2)
- whenCase(3)
- whenCase(4)
- whenCase(6)
- whenCase(8)
- block setconstr:
- const
- SymChars: set[char] = {'a'..'z', 'A'..'Z', '\x80'..'\xFF'}
- proc classify(s: string) =
- case s[0]
- of SymChars, '_': echo "an identifier"
- of {'0'..'9'}: echo "a number"
- else: echo "other"
- classify("Hurra")
- block tduplicates:
- type Kind = enum A, B
- var k = A
- template reject(b) =
- static: doAssert(not compiles(b))
- reject:
- var i = 2
- case i
- of [1, 1]: discard
- else: discard
- reject:
- var i = 2
- case i
- of 1, { 1..2 }: discard
- else: discard
- reject:
- var i = 2
- case i
- of { 1, 1 }: discard
- of { 1, 1 }: discard
- else: discard
- reject:
- case k
- of [A, A]: discard
- var i = 2
- case i
- of { 1, 1 }: discard
- of { 2, 2 }: echo "OK"
- else: discard
- case i
- of { 10..30, 15..25, 5..15, 25..35 }: discard
- else: echo "OK"
- case k
- of {A, A..A}: echo "OK"
- of B: discard
- block tcasestm:
- type
- Tenum = enum eA, eB, eC
- var
- x: string = "yyy"
- y: Tenum = eA
- i: int
- case y
- of eA: write(stdout, "a")
- of eB, eC: write(stdout, "b or c")
- case x
- of "Andreas", "Rumpf": write(stdout, "Hallo Meister!")
- of "aa", "bb": write(stdout, "Du bist nicht mein Meister")
- of "cc", "hash", "when": discard
- of "will", "it", "finally", "be", "generated": discard
- var z = case i
- of 1..5, 8, 9: "aa"
- of 6, 7: "bb"
- elif x == "Ha":
- "cc"
- elif x == "yyy":
- write(stdout, x)
- "dd"
- else:
- "zz"
- echo z
- #OUT ayyy
- let str1 = "Y"
- let str2 = "NN"
- let a = case str1:
- of "Y": true
- of "N": false
- else:
- echo "no good"
- quit("quitting")
- proc toBool(s: string): bool =
- case s:
- of "": raise newException(ValueError, "Invalid boolean")
- elif s[0] == 'Y': true
- elif s[0] == 'N': false
- else: "error".quit(2)
- let b = "NN".toBool()
- doAssert(a == true)
- doAssert(b == false)
- static:
- #bug #7407
- let bstatic = "N".toBool()
- doAssert(bstatic == false)
- var bb: bool
- doAssert(not compiles(
- bb = case str2:
- of "": raise newException(ValueError, "Invalid boolean")
- elif str.startsWith("Y"): true
- elif str.startsWith("N"): false
- ))
- doAssert(not compiles(
- bb = case str2:
- of "Y": true
- of "N": false
- ))
- doAssert(not compiles(
- bb = case str2:
- of "Y": true
- of "N": raise newException(ValueError, "N not allowed")
- ))
- doAssert(not compiles(
- bb = case str2:
- of "Y": raise newException(ValueError, "Invalid Y")
- else: raise newException(ValueError, "Invalid N")
- ))
- doAssert(not compiles(
- bb = case str2:
- of "Y":
- raise newException(ValueError, "Invalid Y")
- true
- else: raise newException(ValueError, "Invalid")
- ))
- doAssert(not compiles(
- bb = case str2:
- of "Y":
- "invalid Y".quit(3)
- true
- else: raise newException(ValueError, "Invalid")
- ))
- #issue #11552
- proc positiveOrNegative(num: int): string =
- result = case num
- of (low(int)+2) .. -1:
- "negative"
- of 0:
- "zero"
- else:
- "impossible"
- #issue #11551
- proc negativeOrNot(num: int): string =
- result = case num
- of low(int) .. -1:
- "negative"
- else:
- "zero or positive"
- doAssert negativeOrNot(-1) == "negative"
- doAssert negativeOrNot(10000000) == "zero or positive"
- doAssert negativeOrNot(0) == "zero or positive"
- ########################################################
- # issue #13490
- import strutils
- func foo(input: string): int =
- try:
- parseInt(input)
- except:
- return
- func foo2(b, input: string): int =
- case b:
- of "Y":
- for c in input:
- result = if c in '0'..'9': parseInt($c)
- else: break
- of "N":
- for c in input:
- result = if c in '0'..'9': parseInt($c)
- else: continue
- else: return
- static:
- doAssert(foo("3") == 3)
- doAssert(foo("a") == 0)
- doAssert(foo2("Y", "a2") == 0)
- doAssert(foo2("Y", "2a") == 2)
- doAssert(foo2("N", "a3") == 3)
- doAssert(foo2("z", "2") == 0)
- doAssert(foo("3") == 3)
- doAssert(foo("a") == 0)
- doAssert(foo2("Y", "a2") == 0)
- doAssert(foo2("Y", "2a") == 2)
- doAssert(foo2("N", "a3") == 3)
- doAssert(foo2("z", "2") == 0)
- # bug #20031
- proc main(a: uint64) =
- case a
- else:
- discard
- static:
- main(10)
- main(10)
- block:
- # Just needs to compile
- proc bar(): int {.discardable.} = discard
- proc foo() {.noreturn.} = discard
- case "*"
- of "*":
- bar()
- else:
- # Make sure this noreturn doesn't
- # cause the discardable to not discard
- foo()
|