summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorflywind <43030857+xflywind@users.noreply.github.com>2020-06-30 21:21:37 +0800
committerGitHub <noreply@github.com>2020-06-30 15:21:37 +0200
commit8be54b8fa7f24fe2886de95c4a2bd356dbae5aa9 (patch)
tree8048f71e82a075a0354bbf2b043954d8c6ad21b4 /tests
parent89a15e417df52454aa5c40ba058c9b19425dd184 (diff)
downloadNim-8be54b8fa7f24fe2886de95c4a2bd356dbae5aa9.tar.gz
add debug fmt string like python's (#14808)
* add debug format string

* remove try except

* add changelog
Diffstat (limited to 'tests')
-rw-r--r--tests/stdlib/tstrformat.nim105
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/stdlib/tstrformat.nim b/tests/stdlib/tstrformat.nim
index 22c0cf95d..c65165946 100644
--- a/tests/stdlib/tstrformat.nim
+++ b/tests/stdlib/tstrformat.nim
@@ -6,6 +6,8 @@ output: '''Received (name: "Foo", species: "Bar")'''
 # issue #7632
 
 import genericstrformat
+import strutils
+
 
 doAssert works(5) == "formatted  5"
 doAssert fails0(6) == "formatted  6"
@@ -86,6 +88,8 @@ proc formatValue(result: var string; value: (array|seq|openArray); specifier: st
 
 doAssert fmt"data1: {data1:8} #" == "data1: [       1,    10000, 10000000] #"
 doAssert fmt"data2: {data2:8} =" == "data2: [10000000,      100,        1] ="
+doAssert fmt"data1: {data1=:8} #" == "data1: data1=[       1,    10000, 10000000] #"
+doAssert fmt"data2: {data2=:8} =" == "data2: data2=[10000000,      100,        1] ="
 
 # custom format Value
 
@@ -103,6 +107,7 @@ proc formatValue[T](result: var string; value: Vec2[T]; specifier: string) =
 let v1 = Vec2[float32](x:1.0, y: 2.0)
 let v2 = Vec2[int32](x:1, y: 1337)
 doAssert fmt"v1: {v1:+08}  v2: {v2:>4}" == "v1: [+0000001, +0000002]  v2: [   1, 1337]"
+doAssert fmt"v1: {v1=:+08}  v2: {v2=:>4}" == "v1: v1=[+0000001, +0000002]  v2: v2=[   1, 1337]"
 
 # bug #11012
 
@@ -126,6 +131,14 @@ doAssert fmt"{pos:3o}" == "100"
 doAssert fmt"{pos:3x}" == " 40"
 doAssert fmt"{pos:3X}" == " 40"
 
+doAssert fmt"{pos=:3}" == "pos= 64"
+doAssert fmt"{pos=:3b}" == "pos=1000000"
+doAssert fmt"{pos=:3d}" == "pos= 64"
+doAssert fmt"{pos=:3o}" == "pos=100"
+doAssert fmt"{pos=:3x}" == "pos= 40"
+doAssert fmt"{pos=:3X}" == "pos= 40"
+
+
 let nat: Natural = 64
 doAssert fmt"{nat:3}" == " 64"
 doAssert fmt"{nat:3b}" == "1000000"
@@ -134,6 +147,13 @@ doAssert fmt"{nat:3o}" == "100"
 doAssert fmt"{nat:3x}" == " 40"
 doAssert fmt"{nat:3X}" == " 40"
 
+doAssert fmt"{nat=:3}" == "nat= 64"
+doAssert fmt"{nat=:3b}" == "nat=1000000"
+doAssert fmt"{nat=:3d}" == "nat= 64"
+doAssert fmt"{nat=:3o}" == "nat=100"
+doAssert fmt"{nat=:3x}" == "nat= 40"
+doAssert fmt"{nat=:3X}" == "nat= 40"
+
 # bug #12612
 proc my_proc =
   const value = "value"
@@ -186,6 +206,14 @@ doAssert fmt"{msg}{'\n'}" == "hello\n"
 doAssert fmt("{msg}\n") == "hello\n"
 doAssert "{msg}\n".fmt == "hello\n"
 
+doAssert fmt"{msg=}\n" == "msg=hello\\n"
+
+doAssert &"{msg=}\n" == "msg=hello\n"
+
+doAssert fmt"{msg=}{'\n'}" == "msg=hello\n"
+doAssert fmt("{msg=}\n") == "msg=hello\n"
+doAssert "{msg=}\n".fmt == "msg=hello\n"
+
 doAssert &"""{"abc":>4}""" == " abc"
 doAssert &"""{"abc":<4}""" == "abc "
 
@@ -204,3 +232,80 @@ doAssert fmt"{123.456:<9.4f}" == "123.4560 "
 doAssert fmt"{123.456:e}" == "1.234560e+02"
 doAssert fmt"{123.456:>13e}" == " 1.234560e+02"
 doAssert fmt"{123.456:13e}" == " 1.234560e+02"
+
+
+doAssert &"""{"abc"=:>4}""" == "\"abc\"= abc"
+doAssert &"""{"abc"=:<4}""" == "\"abc\"=abc "
+
+doAssert fmt"{-12345=:08}" == "-12345=-0012345"
+doAssert fmt"{-1=:3}" == "-1= -1"
+doAssert fmt"{-1=:03}" == "-1=-01"
+doAssert fmt"{16=:#X}" == "16=0x10"
+
+doAssert fmt"{123.456=}" == "123.456=123.456"
+doAssert fmt"{123.456=:>9.3f}" == "123.456=  123.456"
+doAssert fmt"{123.456=:9.3f}" == "123.456=  123.456"
+doAssert fmt"{123.456=:9.4f}" == "123.456= 123.4560"
+doAssert fmt"{123.456=:>9.0f}" == "123.456=     123."
+doAssert fmt"{123.456=:<9.4f}" == "123.456=123.4560 "
+
+doAssert fmt"{123.456=:e}" == "123.456=1.234560e+02"
+doAssert fmt"{123.456=:>13e}" == "123.456= 1.234560e+02"
+doAssert fmt"{123.456=:13e}" == "123.456= 1.234560e+02"
+
+## tests for debug format string
+block:
+  var name = "hello"
+  let age = 21
+  const hobby = "swim"
+  doAssert fmt"{age*9 + 16=}" == "age*9 + 16=205"
+  doAssert &"name: {name    =}\nage: {  age  =: >7}\nhobby: {   hobby=  : 8}" == 
+        "name: name    =hello\nage:   age  =     21\nhobby:    hobby=  swim    "
+  doAssert fmt"{age  ==  12}" == "false"
+  doAssert fmt"{name.toUpperAscii( ) =  }" == "name.toUpperAscii( ) =  HELLO"
+  doAssert fmt"{  toUpperAscii(  s  =  name  )  =   }" == "  toUpperAscii(  s  =  name  )  =   HELLO"
+  doAssert fmt"{  strutils.toUpperAscii(  s  =  name  )  =   }" == "  strutils.toUpperAscii(  s  =  name  )  =   HELLO"
+  doAssert fmt"{age==12}" == "false"
+  doAssert fmt"{age!= 12}" == "true"
+  doAssert fmt"{age  <=  12}" == "false"
+  for i in 1 .. 10:
+    doAssert fmt"{age.float =: .2f}" == "age.float = 21.00"
+  doAssert fmt"{age.float() =:.3f}" == "age.float() =21.000"
+  doAssert fmt"{float age=  :.3f}" == "float age=  21.000"
+  doAssert fmt"{12 == int(`!=`(age, 12))}" == "false"
+  doAssert fmt"{0==1}" == "false"
+
+
+block:
+  let x = "hello"
+  doAssert fmt"{x=}" == "x=" & $x
+  doAssert fmt"{x =}" == "x =" & $x
+
+
+  let y = 3.1415926
+  doAssert fmt"{y=:.2f}" == fmt"y={y:.2f}"
+  doAssert fmt"{y=}" == fmt"y={y}"
+  doAssert fmt"{y =: <16}" == fmt"y ={y: <16}"
+
+  proc hello(a: string, b: float): int = 12
+  template foo(a: string, b: float): int = 18
+
+  doAssert fmt"{hello(x, y)=}" == "hello(x, y)=12"
+  doAssert fmt"{hello(x, y) =}" == "hello(x, y) =12"
+  doAssert fmt"{hello(x, y)= }" == "hello(x, y)= 12"
+  doAssert fmt"{hello(x, y) = }" == "hello(x, y) = 12"
+
+  doAssert fmt"{x.hello(y)=}" == "x.hello(y)=12"
+  doAssert fmt"{x.hello(y) =}" == "x.hello(y) =12"
+  doAssert fmt"{x.hello(y)= }" == "x.hello(y)= 12"
+  doAssert fmt"{x.hello(y) = }" == "x.hello(y) = 12"
+
+  doAssert fmt"{foo(x, y)=}" == "foo(x, y)=18"
+  doAssert fmt"{foo(x, y) =}" == "foo(x, y) =18"
+  doAssert fmt"{foo(x, y)= }" == "foo(x, y)= 18"
+  doAssert fmt"{foo(x, y) = }" == "foo(x, y) = 18"
+
+  doAssert fmt"{x.foo(y)=}" == "x.foo(y)=18"
+  doAssert fmt"{x.foo(y) =}" == "x.foo(y) =18"
+  doAssert fmt"{x.foo(y)= }" == "x.foo(y)= 18"
+  doAssert fmt"{x.foo(y) = }" == "x.foo(y) = 18"