Created
April 3, 2013 21:15
-
-
Save chancila/5305374 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package funsets | |
import org.scalatest.FunSuite | |
import org.junit.runner.RunWith | |
import org.scalatest.junit.JUnitRunner | |
/** | |
* This class is a test suite for the methods in object FunSets. To run | |
* the test suite, you can either: | |
* - run the "test" command in the SBT console | |
* - right-click the file in eclipse and chose "Run As" - "JUnit Test" | |
*/ | |
@RunWith(classOf[JUnitRunner]) | |
class FunSetSuite extends FunSuite { | |
/** | |
* Link to the scaladoc - very clear and detailed tutorial of FunSuite | |
* | |
* http://doc.scalatest.org/1.9.1/index.html#org.scalatest.FunSuite | |
* | |
* Operators | |
* - test | |
* - ignore | |
* - pending | |
*/ | |
/** | |
* Tests are written using the "test" operator and the "assert" method. | |
*/ | |
test("string take") { | |
val message = "hello, world" | |
assert(message.take(5) == "hello") | |
} | |
/** | |
* For ScalaTest tests, there exists a special equality operator "===" that | |
* can be used inside "assert". If the assertion fails, the two values will | |
* be printed in the error message. Otherwise, when using "==", the test | |
* error message will only say "assertion failed", without showing the values. | |
* | |
* Try it out! Change the values so that the assertion fails, and look at the | |
* error message. | |
*/ | |
test("adding ints") { | |
assert(1 + 2 === 3) | |
} | |
import FunSets._ | |
test("contains is implemented") { | |
assert(contains(x => true, 100)) | |
} | |
/** | |
* When writing tests, one would often like to re-use certain values for multiple | |
* tests. For instance, we would like to create an Int-set and have multiple test | |
* about it. | |
* | |
* Instead of copy-pasting the code for creating the set into every test, we can | |
* store it in the test class using a val: | |
* | |
* val s1 = singletonSet(1) | |
* | |
* However, what happens if the method "singletonSet" has a bug and crashes? Then | |
* the test methods are not even executed, because creating an instance of the | |
* test class fails! | |
* | |
* Therefore, we put the shared values into a separate trait (traits are like | |
* abstract classes), and create an instance inside each test method. | |
* | |
*/ | |
trait TestSets { | |
val s1 = singletonSet(1) | |
val s2 = singletonSet(2) | |
val s3 = singletonSet(3) | |
} | |
/** | |
* This test is currently disabled (by using "ignore") because the method | |
* "singletonSet" is not yet implemented and the test would fail. | |
* | |
* Once you finish your implementation of "singletonSet", exchange the | |
* function "ignore" by "test". | |
*/ | |
test("singletonSet(1) contains 1") { | |
/** | |
* We create a new instance of the "TestSets" trait, this gives us access | |
* to the values "s1" to "s3". | |
*/ | |
new TestSets { | |
/** | |
* The string argument of "assert" is a message that is printed in case | |
* the test fails. This helps identifying which assertion failed. | |
*/ | |
assert(contains(s1, 1), "Singleton") | |
} | |
} | |
test("union contains all elements") { | |
new TestSets { | |
val s = union(s1, s2) | |
assert(contains(s, 1), "Union 1") | |
assert(contains(s, 2), "Union 2") | |
assert(!contains(s, 3), "Union 3") | |
} | |
} | |
test("intersect") { | |
new TestSets { | |
val sl = union(s1,s2) | |
val sr = union(s2,s3) | |
val si = intersect(sl,sr) | |
assert(contains(si,2),"Intersect has 2") | |
assert(!contains(si,1),"Intersect does not have 1") | |
assert(!contains(si,3),"Intersect does not have 3") | |
val sd = diff(sl,sr) | |
assert(!contains(sd,2),"diff does not have 2") | |
assert(contains(sd,1),"diff has 1") | |
assert(contains(sd,3),"diff has 3") | |
} | |
} | |
test("filter") { | |
new TestSets { | |
val set = union(s1,union(s2,s3)) | |
val filtered = filter(set,x => x % 2 == 0) | |
assert(!contains(filtered,1),"filter 1 not even") | |
assert(contains(filtered,2),"filter 2 even") | |
assert(!contains(filtered,3),"filter 3 not even") | |
} | |
} | |
test("forall") { | |
new TestSets { | |
val set = union(s1,union(s2,s3)) | |
assert(!forall(set,x => x % 2 ==0),"Sets contain non even numbers") | |
assert(forall(set,x => x < 5),"All numbers are less then 5") | |
} | |
} | |
test("exists") { | |
new TestSets { | |
val set = union(s1,union(s2,s3)) | |
assert(exists(set,x => x % 2 ==0),"Sets contain non even numbers") | |
assert(!exists(set,x => x > 5),"All numbers are less then 5") | |
} | |
} | |
test("map") { | |
new TestSets { | |
val set = map(union(s1,union(s2,s3)),x => x * 3) | |
assert(contains(set,3)) | |
assert(contains(set,6)) | |
assert(contains(set,9)) | |
assert(!contains(set,1)) | |
assert(!contains(set,2)) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment