# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF # licenses this file to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. require File.join(File.dirname(__FILE__), 'spec_helpers') # TODO's # -test w/ Specs # -test w/ ScalaCheck # -failing test # -test passing System props # -test passing ENV variables # -test exclude group # -test include Suite's # -test exclude Suite's describe Buildr::ScalaTest do it 'should be the default test framework when test cases are in Scala' do write 'src/test/scala/com/example/MySuite.scala', <<-SCALA package com.example import org.scalatest.FunSuite class MySuite extends FunSuite { test("addition") { val sum = 1 + 1 assert(sum === 2) } } SCALA define 'foo' project('foo').test.framework.should eql(:scalatest) end it 'should be picked if the test language is Scala' do define 'foo' do test.compile.using(:scalac) test.framework.should eql(:scalatest) end end it 'should include Scalatest dependencies' do define('foo') { test.using(:scalatest) } project('foo').test.compile.dependencies.should include(*artifacts(ScalaTest::REQUIRES)) project('foo').test.dependencies.should include(*artifacts(ScalaTest::REQUIRES)) end it 'should include JMock dependencies' do define('foo') { test.using(:scalatest) } project('foo').test.compile.dependencies.should include(*artifacts(JMock::REQUIRES)) project('foo').test.dependencies.should include(*artifacts(JMock::REQUIRES)) end it 'should include Specs dependencies' do define('foo') { test.using(:scalatest) } project('foo').test.compile.dependencies.should include(*artifacts(ScalaSpecs::REQUIRES)) project('foo').test.dependencies.should include(*artifacts(ScalaSpecs::REQUIRES)) end it 'should include ScalaCheck dependencies' do define('foo') { test.using(:scalatest) } project('foo').test.compile.dependencies.should include(*artifacts(ScalaCheck::REQUIRES)) project('foo').test.dependencies.should include(*artifacts(ScalaCheck::REQUIRES)) end it 'should include public classes extending org.scalatest.FunSuite' do write 'src/test/scala/com/example/MySuite.scala', <<-SCALA package com.example import org.scalatest.FunSuite class MySuite extends FunSuite { test("addition") { val sum = 1 + 1 assert(sum === 2) } } SCALA define('foo').test.invoke project('foo').test.tests.should include('com.example.MySuite') end it 'should ignore classes not extending org.scalatest.FunSuite' do write 'src/test/scala/com/example/NotASuite.scala', <<-SCALA package com.example class Another { } SCALA define('foo').test.invoke project('foo').test.tests.should be_empty end it 'should ignore inner classes' do write 'src/test/scala/com/example/InnerClassTest.scala', <<-SCALA package com.example import org.scalatest.FunSuite class InnerClassTest extends FunSuite { test("addition") { val sum = 1 + 1 assert(sum === 2) } class InnerSuite extends FunSuite { test("addition") { val sum = 1 + 1 assert(sum === 2) } } } SCALA define('foo').test.invoke project('foo').test.tests.should eql(['com.example.InnerClassTest']) end it 'should pass when ScalaTest test case passes' do write 'src/test/scala/PassingSuite.scala', <<-SCALA class PassingSuite extends org.scalatest.FunSuite { test("addition") { val sum = 1 + 1 assert(sum === 2) } } SCALA lambda { define('foo').test.invoke }.should_not raise_error end it 'should fail when ScalaTest test case fails' do write 'src/test/scala/FailingSuite.scala', <<-SCALA class FailingSuite extends org.scalatest.FunSuite { test("failing") { assert(false) } } SCALA lambda { define('foo').test.invoke }.should raise_error(RuntimeError, /Tests failed/) rescue nil end it 'should report failed test names' do write 'src/test/scala/FailingSuite.scala', <<-SCALA class FailingSuite extends org.scalatest.FunSuite { test("failing") { assert(false) } } SCALA define('foo').test.invoke rescue project('foo').test.failed_tests.should include('FailingSuite') end it 'should report to reports/scalatest/TEST-TestSuiteName.txt' do write 'src/test/scala/PassingSuite.scala', <<-SCALA class PassingSuite extends org.scalatest.FunSuite { test("passing") { assert(true) } } SCALA define 'foo' do test.report_to.should be(file('reports/scalatest')) end project('foo').test.invoke project('foo').file('reports/scalatest/TEST-PassingSuite.txt').should exist end it 'should pass properties to Suite' do write 'src/test/scala/PropertyTestSuite.scala', <<-SCALA import org.scalatest._ class PropertyTestSuite extends FunSuite { var properties = Map[String, Any]() test("testProperty") { assert(properties("name") === "value") } protected override def runTests(testName: Option[String], reporter: Reporter, stopper: Stopper, includes: Set[String], excludes: Set[String], properties: Map[String, Any]) { this.properties = properties; super.runTests(testName, reporter, stopper, includes, excludes, properties) } } SCALA define('foo').test.using :properties=>{ 'name'=>'value' } project('foo').test.invoke end it 'should set current directory' do mkpath 'baz' expected = File.expand_path('baz') expected.gsub!('/', '\\') if expected =~ /^[A-Z]:/ # Java returns back slashed paths for windows write 'baz/src/test/scala/CurrentDirectoryTestSuite.scala', <<-SCALA class CurrentDirectoryTestSuite extends org.scalatest.FunSuite { test("testCurrentDirectory") { assert("value" === System.getenv("NAME")) assert(#{expected.inspect} === new java.io.File(".").getCanonicalPath()) } } SCALA define 'bar' do define 'baz' do test.include 'CurrentDirectoryTest' end end project('bar:baz').test.invoke end end