add test for plugin
This commit is contained in:
@ -13,6 +13,7 @@
|
|||||||
/* src */
|
/* src */
|
||||||
int testExampleRecord(void);
|
int testExampleRecord(void);
|
||||||
int testPVCopy(void);
|
int testPVCopy(void);
|
||||||
|
int testPlugin(void);
|
||||||
int testPVRecord(void);
|
int testPVRecord(void);
|
||||||
int testLocalProvider(void);
|
int testLocalProvider(void);
|
||||||
int testPVAServer(void);
|
int testPVAServer(void);
|
||||||
@ -24,6 +25,7 @@ void pvDatabaseAllTests(void)
|
|||||||
/* src */
|
/* src */
|
||||||
runTest(testExampleRecord);
|
runTest(testExampleRecord);
|
||||||
runTest(testPVCopy);
|
runTest(testPVCopy);
|
||||||
|
runTest(testPlugin);
|
||||||
runTest(testPVRecord);
|
runTest(testPVRecord);
|
||||||
runTest(testLocalProvider);
|
runTest(testLocalProvider);
|
||||||
runTest(testPVAServer);
|
runTest(testPVAServer);
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
|
|
||||||
SRC_DIRS += $(PVDATABASE_TEST)/src
|
SRC_DIRS += $(PVDATABASE_TEST)/src
|
||||||
|
|
||||||
|
|
||||||
|
TESTPROD_HOST += testPlugin
|
||||||
|
testPlugin_SRCS += testPlugin.cpp
|
||||||
|
testHarness_SRCS += testPlugin.cpp
|
||||||
|
TESTS += testPlugin
|
||||||
|
|
||||||
TESTPROD_HOST += testPVCopy
|
TESTPROD_HOST += testPVCopy
|
||||||
testPVCopy_SRCS += testPVCopy.cpp
|
testPVCopy_SRCS += testPVCopy.cpp
|
||||||
testHarness_SRCS += testPVCopy.cpp
|
testHarness_SRCS += testPVCopy.cpp
|
||||||
@ -23,7 +29,6 @@ testLocalProvider_SRCS += testLocalProvider.cpp
|
|||||||
testHarness_SRCS += testLocalProvider.cpp
|
testHarness_SRCS += testLocalProvider.cpp
|
||||||
TESTS += testLocalProvider
|
TESTS += testLocalProvider
|
||||||
|
|
||||||
|
|
||||||
TESTPROD_HOST += testPVAServer
|
TESTPROD_HOST += testPVAServer
|
||||||
testPVAServer_SRCS += testPVAServer.cpp
|
testPVAServer_SRCS += testPVAServer.cpp
|
||||||
testHarness_SRCS += testPVAServer.cpp
|
testHarness_SRCS += testPVAServer.cpp
|
||||||
|
@ -68,7 +68,6 @@ static void test()
|
|||||||
exampleRecord->unlock();
|
exampleRecord->unlock();
|
||||||
}
|
}
|
||||||
if(debug) {cout << "processed exampleDouble " << endl; }
|
if(debug) {cout << "processed exampleDouble " << endl; }
|
||||||
exampleRecord->destroy();
|
|
||||||
recordName = "powerSupplyExample";
|
recordName = "powerSupplyExample";
|
||||||
PowerSupplyPtr psr;
|
PowerSupplyPtr psr;
|
||||||
pvStructure = createPowerSupply();
|
pvStructure = createPowerSupply();
|
||||||
@ -127,7 +126,6 @@ static void test()
|
|||||||
testOk1(psr->getVoltage()==1.0);
|
testOk1(psr->getVoltage()==1.0);
|
||||||
testOk1(psr->getPower()==1.0);
|
testOk1(psr->getPower()==1.0);
|
||||||
testOk1(psr->getCurrent()==1.0);
|
testOk1(psr->getCurrent()==1.0);
|
||||||
psr->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MAIN(testExampleRecord)
|
MAIN(testExampleRecord)
|
||||||
|
@ -71,7 +71,6 @@ static void test()
|
|||||||
pvRecord->unlock();
|
pvRecord->unlock();
|
||||||
}
|
}
|
||||||
if(debug) {cout << "processed exampleDouble " << endl; }
|
if(debug) {cout << "processed exampleDouble " << endl; }
|
||||||
channelProvider->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MAIN(testLocalProvider)
|
MAIN(testLocalProvider)
|
||||||
|
@ -281,7 +281,6 @@ static void scalarTest()
|
|||||||
string request;
|
string request;
|
||||||
PVStructurePtr pvRequest;
|
PVStructurePtr pvRequest;
|
||||||
PVCopyPtr pvCopy;
|
PVCopyPtr pvCopy;
|
||||||
string builder;
|
|
||||||
string valueNameRecord;
|
string valueNameRecord;
|
||||||
string valueNameCopy;
|
string valueNameCopy;
|
||||||
|
|
||||||
@ -313,7 +312,6 @@ static void scalarTest()
|
|||||||
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
||||||
valueNameCopy = "value";
|
valueNameCopy = "value";
|
||||||
testPVScalar(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
testPVScalar(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void arrayTest()
|
static void arrayTest()
|
||||||
@ -324,7 +322,6 @@ static void arrayTest()
|
|||||||
string request;
|
string request;
|
||||||
PVStructurePtr pvRequest;
|
PVStructurePtr pvRequest;
|
||||||
PVCopyPtr pvCopy;
|
PVCopyPtr pvCopy;
|
||||||
string builder;
|
|
||||||
string valueNameRecord;
|
string valueNameRecord;
|
||||||
string valueNameCopy;
|
string valueNameCopy;
|
||||||
|
|
||||||
@ -350,7 +347,6 @@ static void arrayTest()
|
|||||||
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
||||||
valueNameCopy = "value";
|
valueNameCopy = "value";
|
||||||
testPVScalarArray(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
testPVScalarArray(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void powerSupplyTest()
|
static void powerSupplyTest()
|
||||||
@ -361,7 +357,6 @@ static void powerSupplyTest()
|
|||||||
string request;
|
string request;
|
||||||
PVStructurePtr pvRequest;
|
PVStructurePtr pvRequest;
|
||||||
PVCopyPtr pvCopy;
|
PVCopyPtr pvCopy;
|
||||||
string builder;
|
|
||||||
string valueNameRecord;
|
string valueNameRecord;
|
||||||
string valueNameCopy;
|
string valueNameCopy;
|
||||||
|
|
||||||
@ -395,7 +390,6 @@ static void powerSupplyTest()
|
|||||||
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
pvCopy = PVCopy::create(pvRecord->getPVRecordStructure()->getPVStructure(),pvRequest,"");
|
||||||
valueNameCopy = "power.value";
|
valueNameCopy = "power.value";
|
||||||
testPVScalar(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
testPVScalar(valueNameRecord,valueNameCopy,pvRecord,pvCopy);
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MAIN(testPVCopy)
|
MAIN(testPVCopy)
|
||||||
|
@ -69,7 +69,6 @@ static void scalarTest()
|
|||||||
if(pvRecord && debug) {
|
if(pvRecord && debug) {
|
||||||
cout << pvRecord << endl;
|
cout << pvRecord << endl;
|
||||||
}
|
}
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void arrayTest()
|
static void arrayTest()
|
||||||
@ -81,7 +80,6 @@ static void arrayTest()
|
|||||||
if(pvRecord && debug) {
|
if(pvRecord && debug) {
|
||||||
cout << pvRecord << endl;
|
cout << pvRecord << endl;
|
||||||
}
|
}
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void powerSupplyTest()
|
static void powerSupplyTest()
|
||||||
@ -94,7 +92,6 @@ static void powerSupplyTest()
|
|||||||
if(pvRecord && debug) {
|
if(pvRecord && debug) {
|
||||||
cout << pvRecord << endl;
|
cout << pvRecord << endl;
|
||||||
}
|
}
|
||||||
pvRecord->destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MAIN(testPVRecord)
|
MAIN(testPVRecord)
|
||||||
|
274
test/src/testPlugin.cpp
Normal file
274
test/src/testPlugin.cpp
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
/*testPluginMain.cpp */
|
||||||
|
/**
|
||||||
|
* Copyright - See the COPYRIGHT that is included with this distribution.
|
||||||
|
* EPICS pvData is distributed subject to a Software License Agreement found
|
||||||
|
* in file LICENSE that is included with this distribution.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @author mrk
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Author: Marty Kraimer */
|
||||||
|
#include <epicsUnitTest.h>
|
||||||
|
#include <testMain.h>
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <string>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <memory>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <epicsStdio.h>
|
||||||
|
#include <epicsMutex.h>
|
||||||
|
#include <epicsEvent.h>
|
||||||
|
#include <epicsThread.h>
|
||||||
|
|
||||||
|
#include <pv/standardField.h>
|
||||||
|
#include <pv/standardPVField.h>
|
||||||
|
#include <pv/channelProviderLocal.h>
|
||||||
|
#include <pv/convert.h>
|
||||||
|
#define epicsExportSharedSymbols
|
||||||
|
#include "powerSupply.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using std::tr1::static_pointer_cast;
|
||||||
|
using namespace epics::pvData;
|
||||||
|
using namespace epics::pvAccess;
|
||||||
|
using namespace epics::pvDatabase;
|
||||||
|
|
||||||
|
static bool debug = true;
|
||||||
|
|
||||||
|
static void deadbandTest()
|
||||||
|
{
|
||||||
|
if(debug) {cout << endl << endl << "****deadbandTest****" << endl;}
|
||||||
|
bool result = false;
|
||||||
|
uint32 nset = 0;
|
||||||
|
|
||||||
|
PVStructurePtr pvRecordStructure(getStandardPVField()->scalar(pvDouble,""));
|
||||||
|
PVRecordPtr pvRecord(PVRecord::create("doubleRecord",pvRecordStructure));
|
||||||
|
PVStructurePtr pvRequest(CreateRequest::create()->createRequest("value[deadband=abs:1.0]"));
|
||||||
|
PVCopyPtr pvCopy(PVCopy::create(pvRecordStructure,pvRequest,""));
|
||||||
|
PVStructurePtr pvStructureCopy(pvCopy->createPVStructure());
|
||||||
|
BitSetPtr bitSet(new BitSet(pvStructureCopy->getNumberFields()));
|
||||||
|
PVDoublePtr pvValue(pvRecordStructure->getSubField<PVDouble>("value"));
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "initial"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==1);
|
||||||
|
pvValue->put(.1);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvValue"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==false);
|
||||||
|
testOk1(nset==0);
|
||||||
|
pvValue->put(1.0);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvValue"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void arrayTest()
|
||||||
|
{
|
||||||
|
if(debug) {cout << endl << endl << "****arrayTest****" << endl;}
|
||||||
|
bool result = false;
|
||||||
|
uint32 nset = 0;
|
||||||
|
size_t n = 10;
|
||||||
|
shared_vector<double> values(n);
|
||||||
|
|
||||||
|
PVStructurePtr pvRecordStructure(getStandardPVField()->scalarArray(pvDouble,""));
|
||||||
|
PVRecordPtr pvRecord(PVRecord::create("doubleArrayRecord",pvRecordStructure));
|
||||||
|
PVStructurePtr pvRequest(CreateRequest::create()->createRequest("value[array=1:3]"));
|
||||||
|
PVCopyPtr pvCopy(PVCopy::create(pvRecordStructure,pvRequest,""));
|
||||||
|
PVStructurePtr pvStructureCopy(pvCopy->createPVStructure());
|
||||||
|
BitSetPtr bitSet(new BitSet(pvStructureCopy->getNumberFields()));
|
||||||
|
PVDoubleArrayPtr pvValue(pvRecordStructure->getSubField<PVDoubleArray>("value"));
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "initial"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==false);
|
||||||
|
testOk1(nset==0);
|
||||||
|
for(size_t i=0; i<n; i++) values[i] = i + .06;
|
||||||
|
const shared_vector<const double> yyy(freeze(values));
|
||||||
|
pvValue->putFrom(yyy);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvValue"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void timeStampTest()
|
||||||
|
{
|
||||||
|
if(debug) {cout << endl << endl << "****timeStampTest****" << endl;}
|
||||||
|
bool result = false;
|
||||||
|
uint32 nset = 0;
|
||||||
|
|
||||||
|
PVStructurePtr pvRecordStructure(getStandardPVField()->scalar(pvDouble,"timeStamp"));
|
||||||
|
PVRecordPtr pvRecord(PVRecord::create("doubleRecord",pvRecordStructure));
|
||||||
|
PVStructurePtr pvRequest(CreateRequest::create()->createRequest("value,timeStamp[timestamp=current]"));
|
||||||
|
PVCopyPtr pvCopy(PVCopy::create(pvRecordStructure,pvRequest,""));
|
||||||
|
PVStructurePtr pvStructureCopy(pvCopy->createPVStructure());
|
||||||
|
BitSetPtr bitSet(new BitSet(pvStructureCopy->getNumberFields()));
|
||||||
|
PVDoublePtr pvValue(pvRecordStructure->getSubField<PVDouble>("value"));
|
||||||
|
if(debug) {
|
||||||
|
cout << "initial"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after update"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==1);
|
||||||
|
pvRecord->process();
|
||||||
|
pvValue->put(1.0);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvValue"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< " pvRecordStructure\n" << pvRecordStructure
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ignoreTest()
|
||||||
|
{
|
||||||
|
if(debug) {cout << endl << endl << "****ignoreTest****" << endl;}
|
||||||
|
bool result = false;
|
||||||
|
uint32 nset = 0;
|
||||||
|
|
||||||
|
PVStructurePtr pvRecordStructure(getStandardPVField()->scalar(pvDouble,"alarm,timeStamp"));
|
||||||
|
PVRecordPtr pvRecord(PVRecord::create("doubleRecord",pvRecordStructure));
|
||||||
|
PVStructurePtr pvRequest(CreateRequest::create()->createRequest("value,alarm[ignore=true],timeStamp[ignore=true]"));
|
||||||
|
PVCopyPtr pvCopy(PVCopy::create(pvRecordStructure,pvRequest,""));
|
||||||
|
PVStructurePtr pvStructureCopy(pvCopy->createPVStructure());
|
||||||
|
BitSetPtr bitSet(new BitSet(pvStructureCopy->getNumberFields()));
|
||||||
|
PVDoublePtr pvValue(pvRecordStructure->getSubField<PVDouble>("value"));
|
||||||
|
PVStringPtr pvMessage(pvRecordStructure->getSubField<PVString>("alarm.message"));
|
||||||
|
PVIntPtr pvUserTag(pvRecordStructure->getSubField<PVInt>("timeStamp.userTag"));
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "initial"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==false);
|
||||||
|
testOk1(nset==0);
|
||||||
|
pvMessage->put("test message");
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvMessage"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==false);
|
||||||
|
testOk1(nset==1);
|
||||||
|
pvUserTag->put(50);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvMessage"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==false);
|
||||||
|
testOk1(nset==2);
|
||||||
|
pvValue->put(1.0);
|
||||||
|
result = pvCopy->updateCopySetBitSet(pvStructureCopy,bitSet);
|
||||||
|
nset = bitSet->cardinality();
|
||||||
|
if(debug) {
|
||||||
|
cout << "after pvValue"
|
||||||
|
<< " result " << (result ? "true" : "false")
|
||||||
|
<< " nset " << nset
|
||||||
|
<< " bitSet " << *bitSet
|
||||||
|
<< " pvStructureCopy\n" << pvStructureCopy
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
testOk1(result==true);
|
||||||
|
testOk1(nset==3);
|
||||||
|
}
|
||||||
|
|
||||||
|
MAIN(testPlugin)
|
||||||
|
{
|
||||||
|
testPlan(22);
|
||||||
|
deadbandTest();
|
||||||
|
arrayTest();
|
||||||
|
timeStampTest();
|
||||||
|
ignoreTest();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user