//===--- InputStream.swift.gyb --------------------------------*- swift -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// -*- swift -*-
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test

// FIXME: The Android test runner is incapable of running this test, which
//        relies on stdin input.
// UNSUPPORTED: OS=linux-androideabi

import StdlibUnittest


import Swift

var ReadLineTestSuite = TestSuite("ReadLine")

% for strip_newline in ['false', 'true']:
%   newline = '' if strip_newline == 'true' else '\\n'

ReadLineTestSuite.test("EmptyLine/strippingNewline=${strip_newline}")
  .stdin("\n")
  .code {
  expectOptionalEqual("${newline}", readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("Whitespace/strippingNewline=${strip_newline}")
  .stdin(" \t\u{0b}\u{0c}\u{85}\u{2028}\u{2029}\n")
  .code {
  expectOptionalEqual(
    " \t\u{0b}\u{0c}\u{85}\u{2028}\u{2029}${newline}",
    readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("ASCII/length=1/strippingNewline=${strip_newline}")
  .stdin("a\n")
  .code {
  expectOptionalEqual("a${newline}", readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("ASCII/length=2/strippingNewline=${strip_newline}")
  .stdin("ab\n")
  .code {
  expectOptionalEqual("ab${newline}", readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("ASCII/length=3/strippingNewline=${strip_newline}")
  .stdin("abc\n")
  .code {
  expectOptionalEqual("abc${newline}", readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("Unicode/strippingNewline=${strip_newline}")
  // U+0065 LATIN SMALL LETTER E
  // U+00A9 COPYRIGHT SIGN
  // U+0521 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK
  // U+304B HIRAGANA LETTER KA
  // U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
  // U+4587 CJK UNIFIED IDEOGRAPH-4587
  // U+1F425 FRONT-FACING BABY CHICK
  .stdin("\u{0065}\u{00a9}\u{0521}\u{304b}\u{3099}\u{4587}\u{1f425}\u{10b9c4}\n")
  .code {
  expectOptionalEqual(
    "\u{0065}\u{00a9}\u{0521}\u{304b}\u{3099}\u{4587}\u{1f425}\u{10b9c4}${newline}",
    readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("EOF/1/strippingNewline=${strip_newline}")
  .stdin("", eof: true)
  .code {
  expectNil(readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("EOF/2/strippingNewline=${strip_newline}")
  .stdin("abcd 123\n", eof: true)
  .code {
  expectOptionalEqual("abcd 123${newline}", readLine(strippingNewline: ${strip_newline}))
  expectNil(readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("MissingNewlineAtEOF/1/strippingNewline=${strip_newline}")
  .stdin("a", eof: true)
  .code {
  expectOptionalEqual("a", readLine(strippingNewline: ${strip_newline}))
}

ReadLineTestSuite.test("MissingNewlineAtEOF/2/strippingNewline=${strip_newline}")
  .stdin("abcd 123", eof: true)
  .code {
  expectOptionalEqual("abcd 123", readLine(strippingNewline: ${strip_newline}))
}

% end

ReadLineTestSuite.test("strippingNewline=default")
  .stdin("abcd 123\n")
  .code {
  // Check that the default for strippingNewline is true.
  expectOptionalEqual("abcd 123", readLine())
}

ReadLineTestSuite.test("StripNewline/JustCR")
  .stdin("\r", eof: true)
  .code {
  // FIXME: CR by itself is not recognized as a newline.
  expectOptionalEqual("\r", readLine(strippingNewline: true))
}

ReadLineTestSuite.test("StripNewline/JustLF")
  .stdin("\n")
  .code {
  expectOptionalEqual("", readLine(strippingNewline: true))
}

ReadLineTestSuite.test("StripNewline/JustCR+LF")
  .stdin("\r\n")
  .code {
  expectOptionalEqual("", readLine(strippingNewline: true))
}

ReadLineTestSuite.test("StripNewline/CR")
  .stdin("abcd 123\r", eof: true)
  .code {
  // FIXME: CR by itself is not recognized as a newline.
  expectOptionalEqual("abcd 123\r", readLine(strippingNewline: true))
}

ReadLineTestSuite.test("StripNewline/LF")
  .stdin("abcd 123\n")
  .code {
  expectOptionalEqual("abcd 123", readLine(strippingNewline: true))
}

ReadLineTestSuite.test("StripNewline/CR+LF")
  .stdin("abcd 123\r\n")
  .code {
  expectOptionalEqual("abcd 123", readLine(strippingNewline: true))
}

runAllTests()

