summary refs log tree commit diff stats
path: root/tests/vm/tstring_openarray.nim
blob: 9318344f8529282d1d4789a31f7893fcd1171d6f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# tests various bug when passing string to openArray argument in VM.
# bug #6086
proc map*[T, S](data: openArray[T], op: proc (x: T): S {.closure.}):
                                                            seq[S]{.inline.} =
# map inlined from sequtils
  newSeq(result, data.len)
  for i in 0..data.len-1: result[i] = op(data[i])


proc set_all[T](s: var openArray[T]; val: T) =
  for i in 0..<s.len:
    s[i] = val

proc main() =
  var a0 = "hello_world"
  var a1 = [1,2,3,4,5,6,7,8,9]
  var a2 = @[1,2,3,4,5,6,7,8,9]
  a0.set_all('i')
  a1.set_all(4)
  a2.set_all(4)
  doAssert a0 == "iiiiiiiiiii"
  doAssert a1 == [4,4,4,4,4,4,4,4,4]
  doAssert a2 == @[4,4,4,4,4,4,4,4,4]

const constval0 = "hello".map(proc(x: char): char = x)
const constval1 = [1,2,3,4].map(proc(x: int): int = x)

doAssert("hello".map(proc(x: char): char = x) == constval0)
doAssert([1,2,3,4].map(proc(x: int): int = x) == constval1)

static: main()
main()
pan class="w"> Stream buf: string isend: bool HeaderList* = ref object table* {.jsget.}: Table[string, seq[string]] # Originally from the stdlib MimePart* = object name*, content*: string case isFile*: bool of true: filename*, contentType*: string fileSize*: int64 isStream*: bool else: discard MimeData* = object content*: seq[MimePart] iterator pairs*(headers: HeaderList): (string, string) = for k, vs in headers.table: for v in vs: yield (k, v) proc rsReadData(s: Stream, buffer: pointer, bufLen: int): int = var s = ReadableStream(s) if s.atEnd: return 0 while s.buf.len < bufLen: var len: int s.isource.read(len) if len == 0: result = s.buf.len copyMem(buffer, addr(s.buf[0]), result) s.buf = s.buf.substr(result) s.isend = true return var nbuf: string s.isource.readStr(len, nbuf) s.buf &= nbuf assert s.buf.len >= bufLen result = bufLen copyMem(buffer, addr(s.buf[0]), result) s.buf = s.buf.substr(result) if s.buf.len == 0: var len: int s.isource.read(len) if len == 0: s.isend = true else: s.isource.readStr(len, s.buf) proc rsAtEnd(s: Stream): bool = ReadableStream(s).isend proc rsClose(s: Stream) = {.cast(tags: [WriteIOEffect]).}: #TODO TODO TODO ew. var s = ReadableStream(s) if s.isend: return s.buf = "" while true: var len: int s.isource.read(len) if len == 0: s.isend = true break s.isource.setPosition(s.isource.getPosition() + len) proc newReadableStream*(isource: Stream): ReadableStream = new(result) result.isource = isource result.readDataImpl = rsReadData result.atEndImpl = rsAtEnd result.closeImpl = rsClose var len: int result.isource.read(len) if len == 0: result.isend = true else: result.isource.readStr(len, result.buf) func newHeaderList*(): HeaderList = new(result) func newHeaderList*(table: Table[string, string]): HeaderList = new(result) for k, v in table: let k = k.toHeaderCase() if k in result.table: result.table[k].add(v) else: result.table[k] = @[v] func newRequest*(url: Url, httpmethod: HttpMethod, headers: HeaderList, body = none(string), multipart = none(MimeData)): Request = return Request( url: url, httpmethod: httpmethod, headers: headers, body: body, multipart: multipart ) func newRequest*(url: Url, httpmethod = HTTP_GET, headers: seq[(string, string)] = @[], body = none(string), multipart = none(MimeData)): Request {.jsctor.} = let hl = newHeaderList() for pair in headers: let (k, v) = pair hl.table[k] = @[v] return newRequest(url, httpmethod, hl, body, multipart) func newRequest*(url: Url, httpmethod: HttpMethod, headers: openarray[(string, string)], body = none(string), multipart = none(MimeData)): Request = return newRequest(url, httpmethod, @headers, body, multipart) proc `[]=`*(multipart: var MimeData, k, v: string) = multipart.content.add(MimePart(name: k, content: v)) proc add*(headers: var HeaderList, k, v: string) = let k = k.toHeaderCase() if k notin headers.table: headers.table[k] = @[v] else: headers.table[k].add(v) proc `[]=`*(headers: var HeaderList, k, v: string) = headers.table[k.toHeaderCase()] = @[v] func getOrDefault*(headers: HeaderList, k: string, default = ""): string = let k = k.toHeaderCase() if k in headers.table: headers.table[k][0] else: default proc readAll*(response: Response): string {.jsfunc.} = result = response.body.readAll() response.body.close() proc close*(response: Response) {.jsfunc.} = response.body.close() proc addRequestModule*(ctx: JSContext) = ctx.registerType(Request) ctx.registerType(Response) ctx.registerType(HeaderList)