Files
XPlaneConnectCSP/TestScripts/C Tests/DrefTests.h
Jason Watkins ec759cbbff Refactored C Tests
The C client tests were getting a bit unwieldy. Moved each block of tests to a separate file based on the functionality being tested. I've just put all of the test code directly in the headers because there doesn't seem to be any reason for the test headers to be included anywhere except in main.c.
2015-05-07 15:24:57 -07:00

247 lines
5.5 KiB
C

//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
//National Aeronautics and Space Administration. All Rights Reserved.
#ifndef DREFTESTS_H
#define DREFTESTS_H
#include "Test.h"
#include "xplaneConnect.h"
int doGETDTest(char* drefs[], float* expected[], int count, int sizes[])
{
// Setup memory
int* asizes = (int*)malloc(sizeof(int) * count);
float** actual = (float**)malloc(sizeof(float*) * count);
for (int i = 0; i < count; ++i)
{
asizes[i] = sizes[i];
actual[i] = (float*)malloc(sizeof(float) * sizes[i]);
}
// Execute command
XPCSocket sock = openUDP(IP);
int result = getDREFs(sock, drefs, actual, count, asizes);
closeUDP(sock);
if (result < 0)
{
return -1;
}
// Test sizes and values
result = compareArrays(expected, sizes, actual, asizes, count);
for (int i = 0; i < count; ++i)
{
free(actual[i]);
}
free(actual);
free(asizes);
return result;
}
int doDREFTest(char* drefs[], float* values[], float* expected[], int count, int sizes[])
{
// Setup memory
int* asizes = (int*)malloc(sizeof(int) * count);
float** actual = (float**)malloc(sizeof(float*) * count);
for (int i = 0; i < count; ++i)
{
asizes[i] = sizes[i];
actual[i] = (float*)malloc(sizeof(float) * sizes[i]);
}
// Execute command
XPCSocket sock = openUDP(IP);
int result = sendDREFs(sock, drefs, values, sizes, count);
if (result >= 0)
{
result = getDREFs(sock, drefs, actual, count, asizes);
}
closeUDP(sock);
if (result < 0)
{
return -1;
}
// Test sizes and values
result = compareArrays(expected, sizes, actual, asizes, count);
for (int i = 0; i < count; ++i)
{
free(actual[i]);
}
free(actual);
free(asizes);
return result;
}
int testGETD_Basic()
{
char* drefs[] =
{
"sim/cockpit/switches/gear_handle_status", //int
"sim/cockpit/autopilot/altitude", //float
"sim/aircraft/prop/acf_prop_type", //int[8]
"sim/cockpit2/switches/panel_brightness_ratio", //float[4]
"sim/aircraft/view/acf_tailnum", //byte[40]
"sim/flightmodel/position/elevation" //double
};
int sizes[] = { 1, 1, 8, 4, 40, 1 };
float* expected[6];
for (int i = 0; i < 6; ++i)
{
expected[i] = (float*)malloc(sizeof(float) * sizes[i]);
for (int j = 0; j < sizes[i]; ++j)
{
expected[i][j] = NAN;
}
}
return doGETDTest(drefs, expected, 6, sizes);
}
int testGETD_TestFloat()
{
char* dref = "sim/test/test_float";
int size = 1;
float* expected[1];
expected[0] = (float*)malloc(sizeof(float));
expected[0][0] = 0.0F;
int result = doGETDTest(&dref, &expected, 1, &size);
free(expected[0]);
return result;
}
int testGETD_Types()
{
char* drefs[] =
{
"sim/cockpit/switches/gear_handle_status", //int
"sim/cockpit/autopilot/altitude", //float
"sim/aircraft/prop/acf_prop_type", //int[8]
"sim/cockpit2/switches/panel_brightness_ratio", //float[4]
"sim/aircraft/view/acf_tailnum", //byte[40]
"sim/flightmodel/position/elevation" //double
};
int sizes[] = { 1, 1, 8, 4, 40, 1 };
float* data[6];
for (int i = 0; i < 6; ++i)
{
data[i] = (float*)malloc(sizeof(float) * sizes[i]);
}
// Execute command
XPCSocket sock = openUDP(IP);
int result = getDREFs(sock, drefs, data, 6, sizes);
closeUDP(sock);
// Tests
if (result < 0)
{
return -1;
}
// Verify sizes
if (sizes[0] != 1 || sizes[1] != 1 || sizes[2] != 8
|| sizes[3] != 4 || sizes[4] != 40 || sizes[5] != 1)
{
return -2;
}
// Verify integer drefs are integers
if ((float)((int)data[0][0]) != data[0][0])
{
return -3;
}
for (int i = 0; i < 8; ++i)
{
if ((float)((int)data[2][i]) != data[2][i])
{
return -3;
}
}
for (int i = 0; i < 40; ++i)
{
if ((float)((char)data[4][i]) != data[4][i])
{
return -3;
}
}
// Verify tail number has at least one valid character
if (data[4][0] <= 0 || data[4][0] > 127)
{
return -4;
}
return 0;
}
int testDREF()
{
char* drefs[] =
{
"sim/cockpit/switches/gear_handle_status", //int
"sim/cockpit/autopilot/altitude", //float
"sim/aircraft/prop/acf_prop_type", //int[8]
"sim/cockpit2/switches/panel_brightness_ratio", //float[4]
"sim/aircraft/view/acf_tailnum", //byte[40]
"sim/flightmodel/position/elevation" //double - Read only
};
float* values[6];
float* expected[6];
int sizes[6];
// Setup
sizes[0] = 1;
values[0] = (float*)malloc(sizes[0] * sizeof(float));
expected[0] = values[0];
values[0][0] = 1;
sizes[1] = 1;
values[1] = (float*)malloc(sizes[1] * sizeof(float));
expected[1] = values[1];
values[1][0] = 4000.0F;
sizes[2] = 8;
values[2] = (float*)malloc(sizes[2] * sizeof(float));
expected[2] = values[2];
for (int i = 0; i < 8; ++i)
{
values[2][i] = 0;
}
sizes[3] = 4;
values[3] = (float*)malloc(sizes[3] * sizeof(float));
expected[3] = values[3];
for (int i = 0; i < 4; ++i)
{
values[3][i] = 0.25F;
}
sizes[4] = 40;
values[4] = (float*)malloc(sizes[4] * sizeof(float));
expected[4] = (float*)malloc(sizes[4] * sizeof(float));
memset(values[4], 0, sizes[4] * sizeof(float));
values[4][0] = 78.0F; //N
values[4][1] = 55.0F; //7
values[4][2] = 52.0F; //4
values[4][3] = 56.0F; //8
values[4][4] = 53.0F; //5
values[4][5] = 89.0F; //Y
expected[4][0] = 78.0F; //N
expected[4][1] = 55.0F; //7
expected[4][2] = 52.0F; //4
expected[4][3] = 56.0F; //8
expected[4][4] = 53.0F; //5
expected[4][5] = 89.0F; //Y
for (int i = 6; i < sizes[4]; ++i)
{
expected[4][i] = NAN;
}
sizes[5] = 1;
values[5] = (float*)malloc(sizes[5] * sizeof(float));
expected[5] = (float*)malloc(sizes[5] * sizeof(float));
values[5][0] = 5000.0F;
expected[5][0] = NAN;
return doDREFTest(drefs, values, expected, 6, sizes);
}
#endif