mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* make more standard libraries work with `nimPreviewSlimSystem` * typo * part two * Delete specutils.nim * fixes more tests * more fixes * fixes tests * fixes three more tests * add formatfloat import * fix * last
94 lines
2.3 KiB
Nim
94 lines
2.3 KiB
Nim
discard """
|
|
targets: "c cpp js"
|
|
matrix: "--gc:refc; --gc:arc"
|
|
"""
|
|
|
|
from std/sugar import collect
|
|
from stdtest/testutils import whenRuntimeJs, whenVMorJs
|
|
import std/assertions
|
|
|
|
template testMitems() =
|
|
block:
|
|
var a = "abc"
|
|
var b = a.cstring
|
|
let s = collect:
|
|
for bi in mitems(b):
|
|
if bi == 'b': bi = 'B'
|
|
bi
|
|
whenRuntimeJs:
|
|
discard # xxx mitems should give CT error instead of @['\x00', '\x00', '\x00']
|
|
do:
|
|
doAssert s == @['a', 'B', 'c']
|
|
|
|
block:
|
|
var a = "abc\0def"
|
|
var b = a.cstring
|
|
let s = collect:
|
|
for bi in mitems(b):
|
|
if bi == 'b': bi = 'B'
|
|
bi
|
|
whenRuntimeJs:
|
|
discard # ditto
|
|
do:
|
|
doAssert s == @['a', 'B', 'c']
|
|
|
|
proc mainProc() =
|
|
testMitems()
|
|
|
|
template main() =
|
|
block: # bug #13859
|
|
let str = "abc".cstring
|
|
doAssert len(str).int8 == 3
|
|
doAssert len(str).int16 == 3
|
|
doAssert len(str).int32 == 3
|
|
var str2 = "cde".cstring
|
|
doAssert len(str2).int8 == 3
|
|
doAssert len(str2).int16 == 3
|
|
doAssert len(str2).int32 == 3
|
|
|
|
const str3 = "abc".cstring
|
|
doAssert len(str3).int32 == 3
|
|
doAssert len("abc".cstring).int16 == 3
|
|
doAssert len("abc".cstring).float32 == 3.0
|
|
|
|
block: # bug #17159
|
|
block:
|
|
var a = "abc"
|
|
var b = a.cstring
|
|
doAssert $(b, ) == """("abc",)"""
|
|
let s = collect:
|
|
for bi in b: bi
|
|
doAssert s == @['a', 'b', 'c']
|
|
|
|
block:
|
|
var a = "abc\0def"
|
|
var b = a.cstring
|
|
let s = collect:
|
|
for bi in b: bi
|
|
whenRuntimeJs:
|
|
doAssert $(b, ) == """("abc\x00def",)"""
|
|
doAssert s == @['a', 'b', 'c', '\x00', 'd', 'e', 'f']
|
|
do:
|
|
doAssert $(b, ) == """("abc",)"""
|
|
doAssert s == @['a', 'b', 'c']
|
|
|
|
block:
|
|
when defined(gcArc): # xxx SIGBUS
|
|
discard
|
|
else:
|
|
mainProc()
|
|
when false: # xxx bug vm: Error: unhandled exception: 'node' is not accessible using discriminant 'kind' of type 'TFullReg' [FieldDefect]
|
|
testMitems()
|
|
|
|
block: # bug #13321: [codegen] --gc:arc does not properly emit cstring, results in SIGSEGV
|
|
let a = "hello".cstring
|
|
doAssert $a == "hello"
|
|
doAssert $a[0] == "h"
|
|
doAssert $a[4] == "o"
|
|
whenVMorJs: discard # xxx this should work in vm, refs https://github.com/timotheecour/Nim/issues/619
|
|
do:
|
|
doAssert a[a.len] == '\0'
|
|
|
|
static: main()
|
|
main()
|