 Test For Take In Athread
Test For Take In AthreadThis is part of JavaUnitTestChallengeSolved. -- DonWells
Now we can add a threaded take test. I need to reuse the sleepHalfSecond() message so I am going to just move it to Test itself. I also need a good way to look at what the take thread got as output. So I am going to create a static (class) instance variable to hold an array of values as they are received. Because it is static, I had better reset it to empty before I use it. I also add a convenient access method also.
 import java.lang.*;
 public class TakeThread extends Thread {
    public static String output [] = {"z", "z", "z", "z", "z", "z", "z", "z", "z", "z"};
    public static int outputLength = 0;
    public BoundedBuffer buffer;
    TakeThread(BoundedBuffer aBuffer){
        buffer = aBuffer;}
    public void run (){
        take();
        take();
        take();
        take();
        take();}
    public synchronized void take(){
        String taken = "z";
        try {
            taken = (String) buffer.take();}
        catch (InterruptedException exception) {};
        output[outputLength++] = taken;}
    public static void resetOutput(){
        for (int each = 0; each < output.length; each++){
            output[each] = "z";};
        outputLength = 0;}
    public static boolean doesOuputInclude (int aLocation, String aValue){
        return output[aLocation] == aValue;}
 }
Now the test:
public class TakeThreadTest extends Test {
    BoundedBuffer buffer;
    TakeThread takeThread;
    public void setUp(){
        buffer = new BoundedBuffer();
        takeThread = new TakeThread(buffer);
        buffer.buffer[0] = "a";
        buffer.buffer[1] = "b";
        buffer.buffer[2] = "c";
        buffer.buffer[3] = "d";
        buffer.occupied = 4;
        buffer.takeAt = 2;
        buffer.putAt = 2;} 
    public void runTest(){
        TakeThread.resetOutput();
        takeThread.start();
        sleepHalfSecond();
        should (TakeThread.doesOuputInclude(0, "c"), "first out should be c");
        should(TakeThread.doesOuputInclude(1, "d"), "second out should be d");
        should(TakeThread.doesOuputInclude(2, "a"), "third out should be a");
        should(TakeThread.doesOuputInclude(3, "b"), "fourth out should be b");
        should(buffer.occupied == 0, "The buffer should be empty");
        should(buffer.takeAt == 2, "takeAt should be 2 again");
        onePut("e");
        waitForTakeToFinish();
        should (TakeThread.doesOuputInclude(4, "e"), "last out should be e");}
    public String take(){
        String taken;
        try {
            taken = (String) buffer.take();}
        catch (InterruptedException exception){
            taken = "";};
        return taken;}
   public void onePut(String aString){
        try {
            buffer.put(aString);}
        catch (InterruptedException exception){};}
    public void waitForTakeToFinish(){
        try {
            takeThread.join(1000);}
        catch (InterruptedException exception) {};}
}
It runs.
 
This test is really a duplicate of the original TakeAloneTest?. I could go back and remove it; for now I will just save it. Now we need to look at both threads running together.
 EditText of this page
(last edited March 4, 2002)
or FindPage with title or text search
 EditText of this page
(last edited March 4, 2002)
or FindPage with title or text search