discard """
  matrix: "--gc:refc; --gc:arc"
  input: "Arne"
  output: '''
Hello! What is your name?
Nice name: Arne
fs is: nil
threw exception
_heh_
'''
  nimout: '''
I
AM
GROOT
'''
"""


import streams


block tstreams:
  var outp = newFileStream(stdout)
  var inp = newFileStream(stdin)
  writeLine(outp, "Hello! What is your name?")
  var line = readLine(inp)
  writeLine(outp, "Nice name: " & line)


block tstreams2:
  var
    fs = newFileStream("amissingfile.txt")
    line = ""
  echo "fs is: ",repr(fs)
  if not isNil(fs):
    while fs.readLine(line):
      echo line
    fs.close()


block tstreams3:
  try:
    var fs = openFileStream("shouldneverexist.txt")
  except IOError:
    echo "threw exception"

  static:
    var s = newStringStream("I\nAM\nGROOT")
    for line in s.lines:
      echo line
    s.close

# bug #12410

var a = newStringStream "hehohihahuhyh"
a.readDataStrImpl = nil

var buffer = "_ooo_"

doAssert a.readDataStr(buffer, 1..3) == 3

echo buffer


block:
  var ss = newStringStream("The quick brown fox jumped over the lazy dog.\nThe lazy dog ran")
  doAssert(ss.getPosition == 0)
  doAssert(ss.peekStr(5) == "The q")
  doAssert(ss.getPosition == 0) # haven't moved
  doAssert(ss.readStr(5) == "The q")
  doAssert(ss.getPosition == 5) # did move
  doAssert(ss.peekLine() == "uick brown fox jumped over the lazy dog.")
  doAssert(ss.getPosition == 5) # haven't moved
  var str = newString(100)
  doAssert(ss.peekLine(str))
  doAssert(str == "uick brown fox jumped over the lazy dog.")
  doAssert(ss.getPosition == 5) # haven't moved
  # bug #19707 - Ensure we dont error with writing over literals on arc/orc
  ss.setPosition(0)
  ss.write("hello")
  ss.setPosition(0)
  doAssert(ss.peekStr(5) == "hello")

# bug #19716
static: # Ensure streams it doesnt break with nimscript on arc/orc #19716
  let s = newStringStream("a")
  doAssert s.data == "a"

template main =
  var strm = newStringStream("abcde")
  var buffer = "12345"
  doAssert strm.readDataStr(buffer, 0..3) == 4
  doAssert buffer == "abcd5"
  strm.close()

static: main()
main()
