trait RichTest {
  val s1 = """abc"""
  val s2 = """abc\txyz\n"""
  val s3 = """abc
              xyz"""
  val s4 = """abc
              |xyz"""
  val s5 = """abc
              #xyz"""
  def getObjectName: String = {
    val cn = this.getClass().getName()
    cn.substring(0, cn.length-1)
  }
  def length[A](it: Iterator[A]) = it.toList.length
  def length[A](it: Iterable[A]) = it.toList.length
  def run: Unit
}
object RichCharTest1 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println('1'.asDigit == 1)
    println('A'.asDigit == 10)
  }
}
// object RichCharTest2 extends RichTest {
//   case class C(s: String) {
//     private val it = s.iterator
//     private var c: Char = _
//     def ch(): Char = c
//     def nextch(): Unit = { c = if (it.hasNext) it.next else ';' }
//     def err(msg: String) = println(msg)
//     nextch()
//   }
//   def run {
//     println("\n" + getObjectName + ":")
//     val c1 = C("x4A;")
//     val s1 = xml.Utility.parseCharRef(c1.ch, c1.nextch, c1.err)
//     val c2 = C("74;")
//     val s2 = xml.Utility.parseCharRef(c2.ch, c2.nextch, c2.err)
//     println(s1 == s2)
//   }
// }
object RichIntTest extends RichTest {
  private val n = 10
  private val m = -2
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println(length(0 until n))
    println(length(0 to n))
    println(length(m until n))
    println(length(m to n))
    println(length(n until m))
    println(length(n to m))

    println(16.toBinaryString) // should be "10000"
    println(16.toHexString)    // should be "10"
    println(16.toOctalString)  // should be "20"

    println(65537.toHexString) // should be "10001"
    println((-1).toHexString)  // should be "ffffffff"
  }
}
object RichStringTest1 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println("s1: " + s1)
    println("s2: " + s2)
    println("s3: " + s3)
    println("s4: " + s4)
    println("s5: " + s5)
  }
}
object RichStringTest2 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    Console.print("s1: "); s1.lines foreach println
    Console.print("s2: "); s2.lines foreach println
    Console.print("s3: "); s3.lines foreach println
    Console.print("s4: "); s4.lines foreach println
    Console.print("s5: "); s5.lines foreach println
  }
}
object RichStringTest3 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println("s1: " + s1.stripLineEnd)
    println("s2: " + s2.stripLineEnd)
    println("s3: " + s3.stripLineEnd)
    println("s4: " + s4.stripLineEnd)
    println("s5: " + s5.stripLineEnd)
  }
}
object RichStringTest4 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println("s1: " + s1.stripMargin)
    println("s2: " + s2.stripMargin)
    println("s3: " + s3.stripMargin)
    println("s4: " + s4.stripMargin)
    println("s5: " + s5.stripMargin)
  }
}
object RichStringTest5 extends RichTest {
  def run: Unit = {
    println("\n" + getObjectName + ":")
    println("s1: " + s3.stripMargin('#'))
    println("s2: " + s3.stripMargin('#'))
    println("s3: " + s3.stripMargin('#'))
    println("s4: " + s4.stripMargin('#'))
    println("s5: " + s5.stripMargin('#'))
  }
}
object RichStringTest6 extends RichTest {
  def run: Unit = {
    println("a:b:c:d".split(':').toList)
    println("a.b.c.d".split('.').toList)
    println("a$b$c$d".split('$').toList)
    println("a^b^c^d".split('^').toList)
    println("a\\b\\c\\d".split('\\').toList)
    println("a:b:c.d".split(Array(':', '.')).toList)
    println("a:b.c$d".split(Array(':', '.', '$')).toList)
  }
}
/** xxx */
object Test {
  def main(args: Array[String]): Unit = {
    RichCharTest1.run
    //RichCharTest2.run
    RichIntTest.run
    RichStringTest1.run
    RichStringTest2.run
    RichStringTest3.run
    RichStringTest4.run
    RichStringTest5.run
    RichStringTest6.run
  }
}
