summaryrefslogblamecommitdiff
path: root/scalatex/api/src/test/scala/scalatex/ErrorTests.scala
blob: d8cd4f5d6b32c167107a47701947f588c1b6ddd0 (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
                     ^
        """
      )
    }
  }
}