MMS-Loesung-2024-25/tests.c

139 lines
3.6 KiB
C

//
// Created by frederik on 1/11/25.
//
#include "MMS24-25.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <math.h>
void info(char* fmt,...) {
fprintf(stderr, "[\x1B[37;1m INFO \x1B[0m] \x1B[34m'");
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "'\x1B[0m\n");
}
void success(char* fmt,...) {
fprintf(stderr, "[\x1B[32;1m PASS \x1B[0m] \x1B[34m'");
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "'\x1B[0m\n");
}
void error(const char* fmt, ...) {
va_list args;
fprintf(stderr, "<\x1B[31;1m ERROR \x1B[0m: \x1B[34m'");
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
fprintf(stderr, "'\x1B[0m >\n");
exit(-1);
}
void testInterpolation() {
info("testInterpolation");
double dRangeMin = -3;
double dRangeMax = 3;
double dRangeStep = 0.33;
for (double dX1=dRangeMin;dX1<dRangeMax;dX1+=dRangeStep) {
for (double dX2=dRangeMin;dX2<dRangeMax;dX2+=dRangeStep) {
for (double dY1=dRangeMin;dY1<dRangeMax;dY1+=dRangeStep) {
for (double dY2=dRangeMin;dY2<dRangeMax;dY2+=dRangeStep) {
for (double dX=dRangeMin;dX<dRangeMax;dX+=dRangeStep) {
if (dX1 == dX2 || dX1 == dX || dX2 == dX)
continue;
double dR1 = interpolateLine(dX1, dY1, dX2, dY2, dX);
double dR2 = interpolateLine(dX1, dY1, dX, dR1, dX2);
if (round(dR2*1e6) != round(dY2*1e6))
error("Failed assertion for: (%lf, %lf), (%lf, %lf) -> (%lf, %lf); %lf", dX1, dY1, dX2, dY2, dX, dR1, dR2);
}
}
}
}
}
success("testInterpolation();");
}
void testSineAndReadWriteDoubleArraySingle(int nValues, int dPLen, double dAmp) {
info("Trying: %d, %d, %lf", nValues, dPLen, dAmp);
char* fileName = NULL;
fileName = malloc(100*sizeof(char));
if (fileName == NULL) {
error("Could not allocate Memory for `fileName`!");
}
sprintf(fileName, "sine_%d_%d_%lf.results.txt", nValues, dPLen, dAmp);
double *pdSineValues = generateSineValues(
nValues,
dPLen,
dAmp
);
writeDoubleArray(
pdSineValues,
nValues,
fileName
);
success("Wrote %d values to %s", nValues, fileName);
double *pdReadValues = NULL;
int iReadValues = readDoubleArray(
fileName,
&pdReadValues
);
if (iReadValues != nValues) {
error("Failed to read the correct number of values: %d != %d", iReadValues, nValues);
}
success("Read %d values from %s", iReadValues, fileName);
for (int i=0; i<nValues; i++) {
if (round(pdSineValues[i]*1e6) != round(pdReadValues[i]*1e6)) {
error("Failed to read the correct value at index %d: %lf != %lf", i, pdSineValues[i], pdReadValues[i]);
}
}
info("use `plot \"%s\", \"%s\" with lines` to view.", fileName, fileName);
free(fileName);
}
void testSineAndReadWriteDoubleArray() {
info("testSineAndWriteDoubleArray");
testSineAndReadWriteDoubleArraySingle(1000, 300, 1);
testSineAndReadWriteDoubleArraySingle(10, 10, 0.5);
testSineAndReadWriteDoubleArraySingle(10, -10, 0.5);
testSineAndReadWriteDoubleArraySingle(10, 10, 0);
success("testSineAndWriteDoubleArray");
}
int main (int iArgC, char** ppcArgV){
testInterpolation();
testSineAndReadWriteDoubleArray();
return 0;
}