1discard """
2  output:
3'''
4TEMP=C:\Programs\xyz\bin
58 5 0 0
6pre test a:test b:1 c:2 haha:3
7assignment test a:test b:1 c:2 haha:3
8abc123
9'''
10"""
11
12#[
13Concrete '='
14Concrete '='
15Concrete '='
16Concrete '='
17Concrete '='
18GenericT[T] '=' int
19GenericT[T] '=' float
20GenericT[T] '=' float
21GenericT[T] '=' float
22GenericT[T] '=' string
23GenericT[T] '=' int8
24GenericT[T] '=' bool
25GenericT[T] '=' bool
26GenericT[T] '=' bool
27GenericT[T] '=' bool
28]#
29
30block tassign:
31# Test the assignment operator for complex types which need RTTI
32  type
33    TRec = object
34      x, y: int
35      s: string
36      seq: seq[string]
37      arr: seq[seq[array[0..3, string]]]
38    TRecSeq = seq[TRec]
39
40  proc test() =
41    var
42      a, b: TRec
43    a.x = 1
44    a.y = 2
45    a.s = "Hallo!"
46    a.seq = @["abc", "def", "ghi", "jkl"]
47    a.arr = @[]
48    setLen(a.arr, 4)
49    a.arr[0] = @[]
50    a.arr[1] = @[]
51
52    b = a # perform a deep copy here!
53    b.seq = @["xyz", "huch", "was", "soll"]
54    doAssert len(a.seq) == 4
55    doAssert a.seq[3] == "jkl"
56    doAssert len(b.seq) == 4
57    doAssert b.seq[3] == "soll"
58    doAssert b.y == 2
59
60  test()
61
62
63
64import strutils
65block tcopy:
66  proc main() =
67    const
68      example = r"TEMP=C:\Programs\xyz\bin"
69    var
70      a, b: string
71      p: int
72    p = find(example, "=")
73    a = substr(example, 0, p-1)
74    b = substr(example, p+1)
75    writeLine(stdout, a & '=' & b)
76
77  main()
78
79
80
81block tgenericassign:
82  type
83    TAny = object {.pure.}
84      value: pointer
85      rawType: pointer
86
87  proc newAny(value, rawType: pointer): TAny =
88    result.value = value
89    result.rawType = rawType
90
91  var name: cstring = "example"
92
93  var ret: seq[tuple[name: string, a: TAny]] = @[]
94  for i in 0 .. 8000:
95    var tup = ($name, newAny(nil, nil))
96    doAssert(tup[0] == "example")
97    ret.add(tup)
98    doAssert(ret[ret.len()-1][0] == "example")
99
100
101
102block tgenericassign_tuples:
103  var t, s: tuple[x: string, c: int]
104
105  proc ugh: seq[tuple[x: string, c: int]] =
106    result = @[("abc", 232)]
107
108  t = ugh()[0]
109  s = t
110  s = ugh()[0]
111
112  doAssert s[0] == "abc"
113  doAssert s[1] == 232
114
115
116
117block tobjasgn:
118  type
119    TSomeObj = object of RootObj
120      a, b: int
121    PSomeObj = ref object
122      a, b: int
123
124  var a = TSomeObj(a: 8)
125  var b = PSomeObj(a: 5)
126  echo a.a, " ", b.a, " ", a.b, " ", b.b
127
128  # bug #575
129
130  type
131    Something = object of RootObj
132      a: string
133      b, c: int32
134
135  type
136    Other = object of Something
137      haha: int
138
139  proc `$`(x: Other): string =
140    result = "a:" & x.a & " b:" & $x.b & " c:" & $x.c & " haha:" & $x.haha
141
142  var
143    t: Other
144
145  t.a = "test"
146  t.b = 1
147  t.c = 2
148  t.haha = 3
149
150  echo "pre test ", $t
151  var x = t
152  echo "assignment test ", x
153
154
155when false:
156  type
157    Concrete = object
158      a, b: string
159
160  proc `=`(d: var Concrete; src: Concrete) =
161    shallowCopy(d.a, src.a)
162    shallowCopy(d.b, src.b)
163    echo "Concrete '='"
164
165  var x, y: array[0..2, Concrete]
166  var cA, cB: Concrete
167
168  var cATup, cBTup: tuple[x: int, ha: Concrete]
169
170  x = y
171  cA = cB
172  cATup = cBTup
173
174  type
175    GenericT[T] = object
176      a, b: T
177
178  proc `=`[T](d: var GenericT[T]; src: GenericT[T]) =
179    shallowCopy(d.a, src.a)
180    shallowCopy(d.b, src.b)
181    echo "GenericT[T] '=' ", typeof(T).name
182
183  var ag: GenericT[int]
184  var bg: GenericT[int]
185
186  ag = bg
187
188  var xg, yg: array[0..2, GenericT[float]]
189  var cAg, cBg: GenericT[string]
190
191  var cATupg, cBTupg: tuple[x: int, ha: GenericT[int8]]
192
193  xg = yg
194  cAg = cBg
195  cATupg = cBTupg
196
197  var caSeqg, cbSeqg: seq[GenericT[bool]]
198  newSeq(cbSeqg, 4)
199  caSeqg = cbSeqg
200
201  when false:
202    type
203      Foo = object
204        case b: bool
205        of false: xx: GenericT[int]
206        of true: yy: bool
207
208    var
209      a, b: Foo
210    a = b
211
212block tgeneric_assign_varargs:
213  template fatal(msgs: varargs[string]) =
214    for msg in msgs:
215      stdout.write(msg)
216    stdout.write('\n')
217
218  fatal "abc", "123"
219