summaryrefslogblamecommitdiff
path: root/scalatexApi/src/test/scala/scalatex/ErrorTests.scala
blob: 480d84902b2fb02bd797eae20462393298dc1699 (plain) (tree)
1
2
3
4
5
6




                           
                                                         
























                                                                       











                                             
                  






















































                                                                
                                                







































































                                                                  









                                              












































































































































































                                                                                            

   
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("""
            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("@Nil.map{(x: Int, y: String) => omg}"),
            "type mismatch",
            """
          twRuntimeErrors("@Nil.map{(x: Int, 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
                      ^
        """
      )
    }
  }
}