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 """, """ 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 ^ """ ) } } }