package com.tecspy.protocol;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import junit.framework.TestCase;

/**
 *
 * @author Michael Erskine
 *
 */public class EtxMessageByteSinkTest extends TestCase {

    public EtxMessageByteSinkTest(String name) {
        super(name);
    }

    protected void setUp() throws Exception {
        super.setUp();
    }

    /**
    * A simple EtxMessageByteSink that has 'z' as etx and writes its messages
    * to a List.
    */
    public class Testerw extends EtxMessageByteSink {
        public List<String> results = new LinkedList<String>();

        public Testerw() {
            super();
            etx = (byte) 'z';
            maxmsg = 1000;
            msg = new StringBuilder(1000);
        }

        @Override
        protected void handleMsg() {
            results.add("msg(" + msg.length() + "): '" + msg.toString() + "'");
        }

        @Override
        public void processEof() {
            results.add("EOF");
        }

        @Override
        public void processException(IOException e) {
            results.add("IOException: " + e.getMessage());
        }

    }

    public final void test1() {

    }

    public final void testEtxMessageByteSink() {
        // create simple implementation and feed it test byte streams
        // expect certain things to have occurred
        Testerw sink = new Testerw();
        String t1 = "message1zmessage2zmessage3z";
        byte[] bytes = t1.getBytes();

        List<String> expected = new LinkedList<String>();
        expected.add("msg(8): 'message1'");
        expected.add("msg(8): 'message2'");
        expected.add("msg(8): 'message3'");

        sink.processBytes(bytes, bytes.length);

        EtxMessageByteSink.log.debug("expected: " + expected.toString());
        EtxMessageByteSink.log.debug("actual:   " + sink.results.toString());

        if (!sink.results.equals(expected)) {
            EtxMessageByteSink.log.error("expected: " + expected.toString());
            EtxMessageByteSink.log
                    .error("actual:   " + sink.results.toString());
            fail("result doesn't match expected");
        }

    }

}