summaryrefslogblamecommitdiff
path: root/scalatexApi/src/test/scala/scalatex/ErrorTests.scala
blob: 09353379910ba9e220b4f25f60c2c47f72d9376d (plain) (tree)































                                                                       








                                             
               
                   










































































































                                                                 












                                              
               







                                                           
 




                                                  
                                         

             
 
                    
                                                               

                              
                                                               






















































































































































































                                                                                              
     

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