package scalatex
import utest._
import scalatex.stages._
import scalatags.Text.all._
import scalatex.Internals.{DebugFailure, twRuntimeErrors}
/**
* Created by haoyi on 7/14/14.
*/
object ErrorTests extends TestSuite{
def check(x: => Unit, expectedMsg: String, expectedError: String) = {
val DebugFailure(msg, pos) = intercept[DebugFailure](x)
def format(str: String) = {
val whitespace = " \t\n".toSet
"\n" + str.dropWhile(_ == '\n')
.reverse
.dropWhile(whitespace.contains)
.reverse
}
// Format these guys nicely to normalize them and make them
// display nicely in the assert error message if it blows up
val formattedPos = format(pos)
val formattedExpectedPos = format(expectedError)
assert(msg.contains(expectedMsg))
assert(formattedPos == formattedExpectedPos)
}
val tests = TestSuite{
'simple - check(
twRuntimeErrors("omg @notInScope lol"),
"""not found: value notInScope""",
"""
twRuntimeErrors("omg @notInScope lol"),
^
"""
)
'chained{
'properties {
* - check(
twRuntimeErrors("omg @math.lol lol"),
"""object lol is not a member of package math""",
"""
twRuntimeErrors("omg @math.lol lol"),
^
"""
)
* - check(
twRuntimeErrors("omg @math.E.lol lol"),
"""value lol is not a member of Double""",
"""
twRuntimeErrors("omg @math.E.lol lol"),
^
"""
)
* - check(
twRuntimeErrors("omg @_root_.scala.math.lol lol"),
"""object lol is not a member of package math""",
"""
twRuntimeErrors("omg @_root_.scala.math.lol lol"),
^
"""
)
* - check(
twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
"""object gg is not a member of package scala""",
"""
twRuntimeErrors("omg @_root_.scala.gg.lol lol"),
^
"""
)
* - check(
twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
"""object ggnore is not a member of package <root>""",
"""
twRuntimeErrors("omg @_root_.ggnore.math.lol lol"),
^
"""
)
}
'calls{
* - check(
twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
"""object QQ is not a member of package scala""",
"""
twRuntimeErrors("@scala.QQ.abs(-10).tdo(10).sum.z"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
"value tdo is not a member of Int",
"""
twRuntimeErrors("@scala.math.abs(-10).tdo(10).sum.z"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
"value z is not a member of Int",
"""
twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
"value z is not a member of Int",
"""
twRuntimeErrors("@scala.math.abs(-10).to(10).sum.z()"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
"value cow is not a member of Int",
"""
twRuntimeErrors("@scala.math.abs(-10).cow.sum.z"),
^
"""
)
* - check(
twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
"object smath is not a member of package scala",
"""
twRuntimeErrors("@scala.smath.abs.cow.sum.z"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.cos('omg)"),
"type mismatch",
"""
twRuntimeErrors("@scala.math.cos('omg)"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.cos[omg]('omg)"),
"not found: type omg",
"""
twRuntimeErrors("@scala.math.cos[omg]('omg)"),
^
"""
)
* - check(
twRuntimeErrors("""
I am cow hear me moo
@scala.math.abs(-10).tdo(10).sum.z
I weigh twice as much as you
"""),
"value tdo is not a member of Int",
"""
@scala.math.abs(-10).tdo(10).sum.z
^
"""
)
}
'curlies{
* - check(
twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
"missing arguments for method foldLeft",
"""
twRuntimeErrors("@p{@Seq(1, 2, 3).foldLeft(0)}"),
^
"""
)
* - check(
twRuntimeErrors("@Nil.foldLeft{XY}"),
"missing arguments for method foldLeft",
"""
twRuntimeErrors("@Nil.foldLeft{XY}"),
^
"""
)
// * - check(
// twRuntimeErrors("@Seq(1).map{(y: String) => omg}"),
// "type mismatch",
// """
// twRuntimeErrors("@Seq(1).map{(y: String) => omg}"),
// ^
// """
// )
// * - check(
// twRuntimeErrors("@Nil.map{ omg}"),
// "too many arguments for method map",
// """
// twRuntimeErrors("@Nil.map{ omg}"),
// ^
// """
// )
}
'callContents{
* - check(
twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
"value wtf is not a member of (Int, Int)",
"""
twRuntimeErrors("@scala.math.abs((1, 2).wtf)"),
^
"""
)
* - check(
twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
"value wtf is not a member of String",
"""
twRuntimeErrors("@scala.math.abs((1, 2).swap._1.toString().map(_.toString.wtf))"),
^
"""
)
}
}
'ifElse{
'oneLine {
* - check(
twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
"object > is not a member of package math",
"""
twRuntimeErrors("@if(math > 10){ 1 }else{ 2 }"),
^
"""
)
* - check(
twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
"Unspecified value parameter y",
"""
twRuntimeErrors("@if(true){ (@math.pow(10)) * 10 }else{ 2 }"),
^
"""
)
* - check(
twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
"too many arguments for method sin: (x: Double)Double",
"""
twRuntimeErrors("@if(true){ * 10 }else{ @math.sin(3, 4, 5) }"),
^
"""
)
}
'multiLine{
* - check(
twRuntimeErrors("""
Ho Ho Ho
@if(math != 10)
I am a cow
@else
You are a cow
GG
"""),
"object != is not a member of package math",
"""
@if(math != 10)
^
"""
)
* - check(
twRuntimeErrors("""
Ho Ho Ho
@if(4 != 10)
I am a cow @math.lols
@else
You are a cow
GG
"""),
"object lols is not a member of package math",
"""
I am a cow @math.lols
^
"""
)
* - check(
twRuntimeErrors("""
Ho Ho Ho
@if(12 != 10)
I am a cow
@else
@math.E.toString.gog(1)
GG
"""),
"value gog is not a member of String",
"""
@math.E.toString.gog(1)
^
"""
)
}
}
'forLoop{
'oneLine{
'header - check(
twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
"""value omglolol is not a member of Int""",
"""
twRuntimeErrors("omg @for(x <- (0 + 1 + 2) omglolol (10 + 11 + 2)){ hello }"),
^
"""
)
'body - check(
twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
"""too many arguments for method +""",
"""
twRuntimeErrors("omg @for(x <- 0 until 10){ @((x, 2) + (1, 2)) }"),
^
"""
)
}
'multiLine{
'body - check(
twRuntimeErrors("""
omg
@for(x <- 0 until 10)
I am cow hear me moo
I weigh twice as much as @x.kkk
"""),
"""value kkk is not a member of Int""",
"""
I weigh twice as much as @x.kkk
^
"""
)
}
}
'multiLine{
'missingVar - check(
twRuntimeErrors("""
omg @notInScope lol
"""),
"""not found: value notInScope""",
"""
omg @notInScope lol
^
"""
)
// 'wrongType - check(
// twRuntimeErrors("""
// omg @{() => ()} lol
// """),
// """type mismatch""",
// """
// omg @{() => ()} lol
// ^
// """
// )
'bigExpression - check(
twRuntimeErrors("""
@{
val x = 1 + 2
val y = new Object()
val z = y * x
x
}
"""),
"value * is not a member of Object",
"""
val z = y * x
^
"""
)
}
}
}