Some useful stuff

Dependents:   FtEncoder FtControlSet

BufferTest.h

Committer:
humlet
Date:
2013-03-29
Revision:
2:8882925900db

File content as of revision 2:8882925900db:


#include "Buffer.h"
#include "Serial.h"
using namespace mbed;

Serial pc(USBTX, USBRX);

const uint32_t maxSize = 5;

typedef Buffer<int,maxSize> TstBufB;
typedef BufferOnStack<int,maxSize> TstBufS;
typedef BufferOnHeap<int,maxSize> TstBufH;

typedef BufferOnHeap<int,maxSize+1> BahBuf;

void chkBuffer(TstBufB& buf);

int doit()
{
    pc.baud(115200);

    TstBufS bufs1;
    TstBufH bufh1;

    /*
    // the following should not even compile
    BahBuf bah;
    bufs1=bah;
    TstBufH no(bah);

    bufs1.push(23);
    const TstBufB& cbuf=bufs1;
    int& e=cbuf[0];

    */

    chkBuffer(bufs1);
    pc.printf("happyhappyjoyjoy 1\n");
    chkBuffer(bufh1);
    pc.printf("happyhappyjoyjoy 2\n");

    // copy ctor and assignment
    TstBufS bufs;
    for(int i=1; i<=23; ++i) bufs.pushCircular(i);
    bufs1=bufs;
    TstBufS bufs2(bufs1);
    bufh1=bufs2;
    TstBufH bufh2(bufh1);
    TstBufS bufs3(bufh2);
    TstBufH bufh3(bufs2);
    TstBufS bufs4;
    TstBufH bufh4;
    bufs4.push(23);
    bufh4.push(42);
    bufs4=bufh3;
    bufh4=bufs3;

    TstBufB* bufA[8];
    bufA[0]=&bufs1;
    bufA[1]=&bufs2;
    bufA[2]=&bufs3;
    bufA[3]=&bufs4;
    bufA[4]=&bufh1;
    bufA[5]=&bufh2;
    bufA[6]=&bufh3;
    bufA[7]=&bufh4;

    for(int i=0; i<maxSize; ++i)
        for(int j=0; j<8; ++j) {
            int v=(*(bufA[j]))[maxSize-1-i];
            if(v!=23-i) pc.printf("copy ouch %d %d %d\n", i,j,v);
        }
    pc.printf("happyhappyjoyjoy 3\n");
    pc.printf("Test ready!\n");

    return 0;
}

void chkBuffer(TstBufB& buf)
{

    buf.clear();
    // empty buffer checks
    if(buf.size()!=0) pc.printf("ouch01\n");
    if(buf.maxSize()!=maxSize) pc.printf("ouch02\n");

    // fill until full
    for(int i=0; i<maxSize; ++i) {
        if(!buf.push(i+1)) pc.printf("ouch03\n");
        if(buf.size()!=i+1) pc.printf("ouch04\n");
    }

    // overfill
    if(buf.push(12)) pc.printf("ouch05\n");
    if(buf.push(13)) pc.printf("ouch05\n");
    if(buf.size()!=maxSize) pc.printf("ouch06\n");

    // content check
    for(int i=0; i<maxSize; ++i)
        if(buf[i]!=i+1)pc.printf("ouch07\n");

    // pops
    if(buf.popLatest()!=maxSize)pc.printf("ouch08\n");
    if(buf.popLatest()!=maxSize-1)pc.printf("ouch09\n");
    if(buf.popOldest()!=1)pc.printf("ouch10\n");
    if(buf.popOldest()!=2)pc.printf("ouch11\n");

    if(buf.size()!=1) pc.printf("ouch12\n");
    if(buf.popLatest()!=maxSize-2)pc.printf("ouch14\n");
    if(buf.popOldest()!=0)pc.printf("ouch15\n");
    if(buf.popLatest()!=0)pc.printf("ouch16\n");
    if(buf.size()!=0) pc.printf("ouch17\n");

    // fill until full
    for(int i=0; i<maxSize; ++i) {
        buf.pushCircular(i+1);
        if(buf.size()!=i+1) pc.printf("ouch19\n");
    }
    // clear check
    buf.clear();
    if(buf.size()!=0) pc.printf("ouch20\n");

    // fill again
    for(int i=0; i<maxSize+1; ++i) {
        buf.pushCircular(i+1);
    }
    if(buf.size()!=maxSize) pc.printf("ouch22\n");

    if(buf.popOldest()!=2)pc.printf("ouch23\n");
    if(buf.popLatest()!=maxSize+1)pc.printf("ouch24\n");
    if(buf.popLatest()!=maxSize)pc.printf("ouch25\n");
    if(buf.popLatest()!=maxSize-1)pc.printf("ouch26\n");

    if(buf.size()!=maxSize-4) pc.printf("ouch27\n");

    // fill revolving
    for(int i=maxSize-1; i<=maxSize+3; ++i) {
        buf.pushCircular(i);
    }

    if(buf.size()!=maxSize) pc.printf("ouch28\n");

    // content check
    for(int i=0; i<maxSize; ++i)
        if(buf[maxSize-i-1]!=maxSize+3-i)pc.printf("ouch29\n");

    // out of bounds
    if(buf[4223]!=0)pc.printf("ouch30\n");
    if(buf[maxSize]!=0)pc.printf("ouch33\n");
    
    // empty/full
    if(!buf.full())pc.printf("ouch34\n");
    if(buf.empty())pc.printf("ouch35\n");
    buf.clear();
    if(buf.full())pc.printf("ouch36\n");
    if(!buf.empty())pc.printf("ouch37\n");
}