Search code examples
scalacheck

Test java classes with ScalaCheck


I'm trying to test a java class with scalacheck. For example, I have a class Queue within ...\src\main\java\

public class Queue<Item> {

private Node first;
private Node last;
private int N;

private class Node {
    Item item;
    Node next;
}

public boolean isEmpty () { return first == null; }
public int size() { return N;}

public void enqueue(Item item) {
    Node oldLast = last;
    last = new Node();
    last.item = item;
    last.next = null;
    if(isEmpty()) 
        first = last;
    else 
        oldLast = last;
    N++;
}

public Item dequeue() {
    Item item = first.item;
    first = first.next;
    if(isEmpty()) 
        last = null;
    N--;
    return item;
}

}

Then I have a scala test class QueueTest.scala within ...\src\test\scala\

import org.scalacheck.Gen.{choose, oneOf}
import org.scalacheck.Prop.forAll
import org.scalacheck.Gen.choose
import org.scalacheck._
import org.scalacheck.Prop._

class QueueTest extends Properties("Queue") {

    Queue<Int> q;

    property("enque") = Prop.forAll { (n: Int) =>
        (q.enque(n) == n)
    }
}

I just need a head start on how to extend a java generic Queue class? All I'm trying to do is to test enqueue and dequeue methods.

I have looked at StringUtils.scala example from Rick Nillson's github but it's still not clear.

Any suggestions would be appreciated


Solution

  • The only possible test for enque is to call it and make sure doesn't throw an exception.

    If this were my assignment, I'd define a property for all List[Int] and test enqueuing and dequeuing the items of that arbitrary list, such that the queue returns exactly the same items in the same order as the list.


    As requested, here are some examples:

    import org.scalacheck.Properties
    import org.scalacheck.Prop.forAll
    
    object QueueSpec extends Properties("Queue") {
    
      property("enqueue never throws an exception") = forAll {(xs: List[Int]) =>
        val q = new Queue[Int]
        xs.foreach(q.enqueue)
        true
      }
    
      property("dequeue always presents elements in FIFO order") = forAll {(xs: List[Int]) =>
        val q = new Queue[Int]
        xs.foreach(q.enqueue)
        xs.forall{_ == q.dequeue}
      }
    
      property("isEmpty always true after complete dequeue") = forAll {(xs: List[Int]) =>
        val q = new Queue[Int]
        xs.foreach(q.enqueue)
        xs.foreach(_ => q.dequeue)
        q.isEmpty
      }
    }
    

    build.sbt:

    scalaVersion := "2.11.2"
    
    libraryDependencies ++= Seq(
      "org.scalacheck" %% "scalacheck" % "1.11.5" % "test"
    )
    

    result:

    $ sbt test
    [info] + Queue.enqueue never throws an exception: OK, passed 100 tests.
    [info] + Queue.dequeue always presents elements in FIFO order: OK, passed 100 tests.
    [info] + Queue.isEmpty always true after complete dequeue: OK, passed 100 tests.
    [info] Passed: Total 3, Failed 0, Errors 0, Passed 3
    [success] Total time: 2 s, completed 24/09/2014 9:28:10 PM