Fantom

 

//
// Copyright (c) 2011, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   29 Aug 11  Brian Frank  Creation
//

class DocTypeRefTest : Test
{
  Void test()
  {
    // basic
    t := DocTypeRef("foo::Bar")
    verifyBasic(t, "foo", "Bar", false)

    // basic nullable
    t = DocTypeRef("foo::Bar?")
    verifyBasic(t, "foo", "Bar", true)

    // list of basic
    t = DocTypeRef("foo::Bar[]")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "List")
    verifyEq(t.qname, "sys::List")
    verifyEq(t.signature, "foo::Bar[]")
    verifyEq(t.isNullable, false)
    verifyBasic(t.v, "foo", "Bar", false)

    // list of basic nullable
    t = DocTypeRef("foo::Bar?[]")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "List")
    verifyEq(t.qname, "sys::List")
    verifyEq(t.signature, "foo::Bar?[]")
    verifyEq(t.isNullable, false)
    verifyBasic(t.v, "foo", "Bar", true)

    // nullable list
    t = DocTypeRef("foo::Bar[]?")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "List")
    verifyEq(t.qname, "sys::List")
    verifyEq(t.signature, "foo::Bar[]?")
    verifyEq(t.isNullable, true)
    verifyBasic(t.v, "foo", "Bar", false)

    // map of basics
    t = DocTypeRef("[sys::Str:foo::Bar]")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "Map")
    verifyEq(t.qname, "sys::Map")
    verifyEq(t.signature, "[sys::Str:foo::Bar]")
    verifyEq(t.isNullable, false)
    verifyBasic(t.k, "sys", "Str", false)
    verifyBasic(t.v, "foo", "Bar", false)

    // map with nullables
    t = DocTypeRef("[sys::Str:foo::Bar?]?")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "Map")
    verifyEq(t.qname, "sys::Map")
    verifyEq(t.signature, "[sys::Str:foo::Bar?]?")
    verifyEq(t.isNullable, true)
    verifyBasic(t.k, "sys", "Str", false)
    verifyBasic(t.v, "foo", "Bar", true)

    // func no params
    t = DocTypeRef("|->foo::Bar|")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "Func")
    verifyEq(t.qname, "sys::Func")
    verifyEq(t.signature, "|->foo::Bar|")
    verifyEq(t.isNullable, false)
    verifyEq(t.funcParams.size, 0)
    verifyBasic(t.funcReturn, "foo", "Bar", false)

    // func one param
    t = DocTypeRef("|sys::Int->foo::Bar?|?")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "Func")
    verifyEq(t.qname, "sys::Func")
    verifyEq(t.signature, "|sys::Int->foo::Bar?|?")
    verifyEq(t.isNullable, true)
    verifyEq(t.funcParams.size, 1)
    verifyBasic(t.funcParams[0], "sys", "Int", false)
    verifyBasic(t.funcReturn, "foo", "Bar", true)

    // func two params
    t = DocTypeRef("|sys::Int?[],sys::Str->sys::Void|")
    verifyEq(t.pod, "sys")
    verifyEq(t.name, "Func")
    verifyEq(t.qname, "sys::Func")
    verifyEq(t.signature, "|sys::Int?[],sys::Str->sys::Void|")
    verifyEq(t.isNullable, false)
    verifyEq(t.funcParams.size, 2)
    verifyEq(t.funcParams[0].qname, "sys::List")
    verifyBasic(t.funcParams[0].v, "sys", "Int", true)
    verifyBasic(t.funcParams[1], "sys", "Str", false)
    verifyBasic(t.funcReturn, "sys", "Void", false)

    // combos
    t = DocTypeRef("[sys::Str:foo::Bar?[]][]?")
    verifyEq(t.qname, "sys::List")
    verifyEq(t.signature, "[sys::Str:foo::Bar?[]][]?")
    verifyEq(t.isNullable, true)
    t = t.v
    verifyEq(t.qname, "sys::Map")
    verifyEq(t.signature, "[sys::Str:foo::Bar?[]]")
    t = t.v
    verifyEq(t.qname, "sys::List")
    verifyBasic(t.v, "foo", "Bar", true)

    // bug report Feb-2012
    t = DocTypeRef("sys::Str[][]?[]")
    verifyEq(t.qname, "sys::List")
    t = t.v
    verifyEq(t.signature, "sys::Str[][]?")
    verifyEq(t.isNullable, true)
    t = t.v
    verifyEq(t.signature, "sys::Str[]")
    verifyEq(t.isNullable, false)
    t = t.v
    verifyEq(t.signature, "sys::Str")

    // errors
    verifyEq(DocTypeRef.fromStr("foo", false), null)
    verifyErr(ParseErr#) { x := DocTypeRef.fromStr("foo") }
    verifyErr(ParseErr#) { x := DocTypeRef.fromStr("foo", true) }
  }

  Void verifyBasic(DocTypeRef t, Str pod, Str name, Bool nullable)
  {
    verifyEq(t.pod, pod)
    verifyEq(t.name, name)
    verifyEq(t.qname, "$pod::$name")
    verifyEq(t.signature, nullable ? "${t.qname}?" : t.qname)
    verifyEq(t.isNullable, nullable)
    verifyEq(t.isParameterized, false)
  }

}