/* * System Interface Library for games * Copyright (c) 2007-2020 Andrew Church * Released under the GNU GPL version 3 or later; NO WARRANTY is provided. * See the file COPYING.txt for details. * * src/test/math/internal.c: Internal utility routines for math function tests. */ #include "src/base.h" #include "src/math.h" #include "src/test/base.h" #include "src/test/math/internal.h" /*************************************************************************/ /**************************** Test data lists ****************************/ /*************************************************************************/ #define EXACT(...) {__VA_ARGS__, 0} #define APPROX(...) {__VA_ARGS__, 1} #define NONE {0} // C99 doesn't allow an empty initializer list. const VectorTest vector_tests[] = { EXACT (PLUS, 2,2, {1,2}, NONE, 0, {1,2}), EXACT (PLUS, 3,3, {1,2,3}, NONE, 0, {1,2,3}), EXACT (PLUS, 4,4, {1,2,3,4}, NONE, 0, {1,2,3,4}), EXACT (NEG, 2,2, {1,2}, NONE, 0, {-1,-2}), EXACT (NEG, 3,3, {1,2,3}, NONE, 0, {-1,-2,-3}), EXACT (NEG, 4,4, {1,2,3,4}, NONE, 0, {-1,-2,-3,-4}), EXACT (ADD, 2,2, {1,2}, {3.5,5.5}, 0, {4.5,7.5}), EXACT (ADD, 2,3, {1,2}, {4.5,6.5,8.5}, 0, {5.5,8.5}), EXACT (ADD, 2,4, {1,2}, {5.5,7.5,9.5,11.5}, 0, {6.5,9.5}), EXACT (ADD, 3,2, {1,2,3}, {3.5,5.5}, 0, {4.5,7.5, 3.0}), EXACT (ADD, 3,3, {1,2,3}, {4.5,6.5,8.5}, 0, {5.5,8.5,11.5}), EXACT (ADD, 3,4, {1,2,3}, {5.5,7.5,9.5,11.5}, 0, {6.5,9.5,12.5}), EXACT (ADD, 4,2, {1,2,3,4}, {3.5,5.5}, 0, {4.5,7.5, 3.0, 4.0}), EXACT (ADD, 4,3, {1,2,3,4}, {4.5,6.5,8.5}, 0, {5.5,8.5,11.5, 4.0}), EXACT (ADD, 4,4, {1,2,3,4}, {5.5,7.5,9.5,11.5}, 0, {6.5,9.5,12.5,15.5}), EXACT (SUB, 2,2, {1,2}, {3.5,5.5}, 0, {-2.5,-3.5}), EXACT (SUB, 2,3, {1,2}, {4.5,6.5,8.5}, 0, {-3.5,-4.5}), EXACT (SUB, 2,4, {1,2}, {5.5,7.5,9.5,11.5}, 0, {-4.5,-5.5}), EXACT (SUB, 3,2, {1,2,3}, {3.5,5.5}, 0, {-2.5,-3.5, 3.0}), EXACT (SUB, 3,3, {1,2,3}, {4.5,6.5,8.5}, 0, {-3.5,-4.5,-5.5}), EXACT (SUB, 3,4, {1,2,3}, {5.5,7.5,9.5,11.5}, 0, {-4.5,-5.5,-6.5}), EXACT (SUB, 4,2, {1,2,3,4}, {3.5,5.5}, 0, {-2.5,-3.5, 3.0, 4.0}), EXACT (SUB, 4,3, {1,2,3,4}, {4.5,6.5,8.5}, 0, {-3.5,-4.5,-5.5, 4.0}), EXACT (SUB, 4,4, {1,2,3,4}, {5.5,7.5,9.5,11.5}, 0, {-4.5,-5.5,-6.5,-7.5}), EXACT (MUL, 2,2, {1,2}, {3.5,5.25}, 0, {3.5,10.5}), EXACT (MUL, 2,3, {1,2}, {4.5,6.25,8.125}, 0, {4.5,12.5}), EXACT (MUL, 2,4, {1,2}, {5.5,7.25,9.125,11.0625}, 0, {5.5,14.5}), EXACT (MUL, 3,2, {1,2,3}, {3.5,5.25}, 0, {3.5,10.5, 3.0}), EXACT (MUL, 3,3, {1,2,3}, {4.5,6.25,8.125}, 0, {4.5,12.5,24.375}), EXACT (MUL, 3,4, {1,2,3}, {5.5,7.25,9.125,11.0625}, 0, {5.5,14.5,27.375}), EXACT (MUL, 4,2, {1,2,3,4}, {3.5,5.25}, 0, {3.5,10.5, 3.0, 4.0}), EXACT (MUL, 4,3, {1,2,3,4}, {4.5,6.25,8.125}, 0, {4.5,12.5,24.375,4.0}), EXACT (MUL, 4,4, {1,2,3,4}, {5.5,7.25,9.125,11.0625}, 0, {5.5,14.5,27.375,44.25}), EXACT (DIV, 2,2, {1,2}, {2,0.5}, 0, {0.5,4}), EXACT (DIV, 2,3, {1,2}, {2,0.5,1.5}, 0, {0.5,4}), EXACT (DIV, 2,4, {1,2}, {2,0.5,1.5,0.25}, 0, {0.5,4}), EXACT (DIV, 3,2, {1,2,3}, {2,0.5}, 0, {0.5,4,3}), EXACT (DIV, 3,3, {1,2,3}, {2,0.5,1.5}, 0, {0.5,4,2}), EXACT (DIV, 3,4, {1,2,3}, {2,0.5,1.5,0.25}, 0, {0.5,4,2}), EXACT (DIV, 4,2, {1,2,3,4}, {2,0.5}, 0, {0.5,4,3,4}), EXACT (DIV, 4,3, {1,2,3,4}, {2,0.5,1.5}, 0, {0.5,4,2,4}), EXACT (DIV, 4,4, {1,2,3,4}, {2,0.5,1.5,0.25}, 0, {0.5,4,2,16}), EXACT (S_ADD, 2,2, {3,4}, NONE, 0, {3,4}), EXACT (S_ADD, 2,2, {3,4}, NONE, 1, {4,5}), EXACT (S_ADD, 2,2, {3,4}, NONE, 2.5, {5.5,6.5}), EXACT (S_ADD, 3,3, {3,4,5}, NONE, 0, {3,4,5}), EXACT (S_ADD, 3,3, {3,4,5}, NONE, 1, {4,5,6}), EXACT (S_ADD, 3,3, {3,4,5}, NONE, 2.5, {5.5,6.5,7.5}), EXACT (S_ADD, 4,4, {3,4,5,6}, NONE, 0, {3,4,5,6}), EXACT (S_ADD, 4,4, {3,4,5,6}, NONE, 1, {4,5,6,7}), EXACT (S_ADD, 4,4, {3,4,5,6}, NONE, 2.5, {5.5,6.5,7.5,8.5}), EXACT (S_SUB, 2,2, {3,4}, NONE, 0, {3,4}), EXACT (S_SUB, 2,2, {3,4}, NONE, 1, {2,3}), EXACT (S_SUB, 2,2, {3,4}, NONE, 2.5, {0.5,1.5}), EXACT (S_SUB, 3,3, {3,4,5}, NONE, 0, {3,4,5}), EXACT (S_SUB, 3,3, {3,4,5}, NONE, 1, {2,3,4}), EXACT (S_SUB, 3,3, {3,4,5}, NONE, 2.5, {0.5,1.5,2.5}), EXACT (S_SUB, 4,4, {3,4,5,6}, NONE, 0, {3,4,5,6}), EXACT (S_SUB, 4,4, {3,4,5,6}, NONE, 1, {2,3,4,5}), EXACT (S_SUB, 4,4, {3,4,5,6}, NONE, 2.5, {0.5,1.5,2.5,3.5}), EXACT (SCALE, 2,2, {0,0}, NONE, 0, {0,0}), EXACT (SCALE, 2,2, {0,0}, NONE, 1, {0,0}), EXACT (SCALE, 2,2, {0,0}, NONE, 2.5, {0,0}), EXACT (SCALE, 2,2, {1,1}, NONE, 0, {0,0}), EXACT (SCALE, 2,2, {1,1}, NONE, 1, {1,1}), EXACT (SCALE, 2,2, {1,1}, NONE, 2.5, {2.5,2.5}), EXACT (SCALE, 2,2, {3,4}, NONE, 0, {0,0}), EXACT (SCALE, 2,2, {3,4}, NONE, 1, {3,4}), EXACT (SCALE, 2,2, {3,4}, NONE, 2.5, {7.5,10}), EXACT (SCALE, 3,3, {0,0,0}, NONE, 0, {0,0,0}), EXACT (SCALE, 3,3, {0,0,0}, NONE, 1, {0,0,0}), EXACT (SCALE, 3,3, {0,0,0}, NONE, 2.5, {0,0,0}), EXACT (SCALE, 3,3, {1,1,1}, NONE, 0, {0,0,0}), EXACT (SCALE, 3,3, {1,1,1}, NONE, 1, {1,1,1}), EXACT (SCALE, 3,3, {1,1,1}, NONE, 2.5, {2.5,2.5,2.5}), EXACT (SCALE, 3,3, {3,4,5}, NONE, 0, {0,0,0}), EXACT (SCALE, 3,3, {3,4,5}, NONE, 1, {3,4,5}), EXACT (SCALE, 3,3, {3,4,5}, NONE, 2.5, {7.5,10,12.5}), EXACT (SCALE, 4,4, {0,0,0,0}, NONE, 0, {0,0,0,0}), EXACT (SCALE, 4,4, {0,0,0,0}, NONE, 1, {0,0,0,0}), EXACT (SCALE, 4,4, {0,0,0,0}, NONE, 2.5, {0,0,0,0}), EXACT (SCALE, 4,4, {1,1,1,1}, NONE, 0, {0,0,0,0}), EXACT (SCALE, 4,4, {1,1,1,1}, NONE, 1, {1,1,1,1}), EXACT (SCALE, 4,4, {1,1,1,1}, NONE, 2.5, {2.5,2.5,2.5,2.5}), EXACT (SCALE, 4,4, {3,4,5,6}, NONE, 0, {0,0,0,0}), EXACT (SCALE, 4,4, {3,4,5,6}, NONE, 1, {3,4,5,6}), EXACT (SCALE, 4,4, {3,4,5,6}, NONE, 2.5, {7.5,10,12.5,15}), EXACT (S_DIV, 2,2, {0,0}, NONE, 1, {0,0}), EXACT (S_DIV, 2,2, {0,0}, NONE, 2, {0,0}), EXACT (S_DIV, 2,2, {0,0}, NONE, 0.5, {0,0}), EXACT (S_DIV, 2,2, {1,1}, NONE, 1, {1,1}), EXACT (S_DIV, 2,2, {1,1}, NONE, 2, {0.5,0.5}), EXACT (S_DIV, 2,2, {1,1}, NONE, 0.5, {2,2}), EXACT (S_DIV, 2,2, {3,4}, NONE, 1, {3,4}), EXACT (S_DIV, 2,2, {3,4}, NONE, 2, {1.5,2}), EXACT (S_DIV, 2,2, {3,4}, NONE, 0.5, {6,8}), EXACT (S_DIV, 3,3, {0,0,0}, NONE, 1, {0,0,0}), EXACT (S_DIV, 3,3, {0,0,0}, NONE, 2, {0,0,0}), EXACT (S_DIV, 3,3, {0,0,0}, NONE, 0.5, {0,0,0}), EXACT (S_DIV, 3,3, {1,1,1}, NONE, 1, {1,1,1}), EXACT (S_DIV, 3,3, {1,1,1}, NONE, 2, {0.5,0.5,0.5}), EXACT (S_DIV, 3,3, {1,1,1}, NONE, 0.5, {2,2,2}), EXACT (S_DIV, 3,3, {3,4,5}, NONE, 1, {3,4,5}), EXACT (S_DIV, 3,3, {3,4,5}, NONE, 2, {1.5,2,2.5}), EXACT (S_DIV, 3,3, {3,4,5}, NONE, 0.5, {6,8,10}), EXACT (S_DIV, 4,4, {0,0,0,0}, NONE, 1, {0,0,0,0}), EXACT (S_DIV, 4,4, {0,0,0,0}, NONE, 2, {0,0,0,0}), EXACT (S_DIV, 4,4, {0,0,0,0}, NONE, 0.5, {0,0,0,0}), EXACT (S_DIV, 4,4, {1,1,1,1}, NONE, 1, {1,1,1,1}), EXACT (S_DIV, 4,4, {1,1,1,1}, NONE, 2, {0.5,0.5,0.5,0.5}), EXACT (S_DIV, 4,4, {1,1,1,1}, NONE, 0.5, {2,2,2,2}), EXACT (S_DIV, 4,4, {3,4,5,6}, NONE, 1, {3,4,5,6}), EXACT (S_DIV, 4,4, {3,4,5,6}, NONE, 2, {1.5,2,2.5,3}), EXACT (S_DIV, 4,4, {3,4,5,6}, NONE, 0.5, {6,8,10,12}), EXACT (LEN, 2,2, {0,0}, NONE, 0, {0}), EXACT (LEN, 2,2, {0,1}, NONE, 0, {1}), EXACT (LEN, 2,2, {1,0}, NONE, 0, {1}), EXACT (LEN, 2,2, {1.5,2}, NONE, 0, {2.5}), EXACT (LEN, 2,2, {1e-20,1e-20}, NONE, 0, {0}), //Test underflow handling. EXACT (LEN, 3,3, {0,0,0}, NONE, 0, {0}), EXACT (LEN, 3,3, {0,0,1}, NONE, 0, {1}), EXACT (LEN, 3,3, {0,1,0}, NONE, 0, {1}), EXACT (LEN, 3,3, {1,0,0}, NONE, 0, {1}), EXACT (LEN, 3,3, {1.5,3,3}, NONE, 0, {4.5}), EXACT (LEN, 3,3, {1e-20,1e-20,1e-20}, NONE, 0, {0}), EXACT (LEN, 4,4, {0,0,0,0}, NONE, 0, {0}), EXACT (LEN, 4,4, {0,0,0,1}, NONE, 0, {1}), EXACT (LEN, 4,4, {0,0,1,0}, NONE, 0, {1}), EXACT (LEN, 4,4, {0,1,0,0}, NONE, 0, {1}), EXACT (LEN, 4,4, {1,0,0,0}, NONE, 0, {1}), EXACT (LEN, 4,4, {1.5,1.5,1.5,1.5}, NONE, 0, {3}), EXACT (LEN, 4,4, {1e-20,1e-20,1e-20,1e-20}, NONE, 0, {0}), EXACT (LEN2, 2,2, {0,0}, NONE, 0, {0}), EXACT (LEN2, 2,2, {0,1}, NONE, 0, {1}), EXACT (LEN2, 2,2, {1,0}, NONE, 0, {1}), EXACT (LEN2, 2,2, {1.5,2}, NONE, 0, {6.25}), EXACT (LEN2, 2,2, {1e-20,1e-20}, NONE, 0, {0}), EXACT (LEN2, 3,3, {0,1,0}, NONE, 0, {1}), EXACT (LEN2, 3,3, {1,0,0}, NONE, 0, {1}), EXACT (LEN2, 3,3, {1.5,3,3}, NONE, 0, {20.25}), /* √61 can't be represented accurately in single precision (there is * no single precision value whose square, rounded to single precision, * is exactly 61), so this test will fail if length2() is implemented * by squaring the vector length. */ EXACT (LEN2, 3,3, {3,4,6}, NONE, 0, {61}), EXACT (LEN2, 3,3, {1e-20,1e-20,1e-20}, NONE, 0, {0}), EXACT (LEN2, 4,4, {0,0,0,0}, NONE, 0, {0}), EXACT (LEN2, 4,4, {0,0,0,1}, NONE, 0, {1}), EXACT (LEN2, 4,4, {0,0,1,0}, NONE, 0, {1}), EXACT (LEN2, 4,4, {0,1,0,0}, NONE, 0, {1}), EXACT (LEN2, 4,4, {1,0,0,0}, NONE, 0, {1}), EXACT (LEN2, 4,4, {1.5,1.5,1.5,1.5}, NONE, 0, {9}), /* √55 also can't be represented accurately in single precision. */ EXACT (LEN2, 4,4, {5,5,2,1}, NONE, 0, {55}), EXACT (LEN2, 4,4, {1e-20,1e-20,1e-20,1e-20}, NONE, 0, {0}), EXACT (NON_0, 2,2, {0,0}, NONE, 0, {0}), EXACT (NON_0, 2,2, {0,1}, NONE, 0, {1}), EXACT (NON_0, 2,2, {1,0}, NONE, 0, {1}), EXACT (NON_0, 2,2, {1,1}, NONE, 0, {1}), EXACT (NON_0, 3,3, {0,0,0}, NONE, 0, {0}), EXACT (NON_0, 3,3, {0,0,1}, NONE, 0, {1}), EXACT (NON_0, 3,3, {0,1,0}, NONE, 0, {1}), EXACT (NON_0, 3,3, {1,0,0}, NONE, 0, {1}), EXACT (NON_0, 3,3, {1,1,1}, NONE, 0, {1}), EXACT (NON_0, 4,4, {0,0,0,0}, NONE, 0, {0}), EXACT (NON_0, 4,4, {0,0,0,1}, NONE, 0, {1}), EXACT (NON_0, 4,4, {0,0,1,0}, NONE, 0, {1}), EXACT (NON_0, 4,4, {0,1,0,0}, NONE, 0, {1}), EXACT (NON_0, 4,4, {1,0,0,0}, NONE, 0, {1}), EXACT (NON_0, 4,4, {1,1,1,1}, NONE, 0, {1}), EXACT (LEN_IN, 2,2, {0,0}, NONE, 0, {1}), EXACT (LEN_IN, 2,2, {0,1}, NONE, 0, {0}), EXACT (LEN_IN, 2,2, {0,1}, NONE, 1, {1}), EXACT (LEN_IN, 3,3, {0,0,0}, NONE, 0, {1}), EXACT (LEN_IN, 3,3, {0,0,1}, NONE, 0, {0}), EXACT (LEN_IN, 3,3, {0,0,1}, NONE, 1, {1}), EXACT (LEN_IN, 4,4, {0,0,0,0}, NONE, 0, {1}), EXACT (LEN_IN, 4,4, {0,0,0,1}, NONE, 0, {0}), EXACT (LEN_IN, 4,4, {0,0,0,1}, NONE, 1, {1}), EXACT (NORM, 2,2, {0,0}, NONE, 0, {0,0}), EXACT (NORM, 2,2, {0,1}, NONE, 0, {0,1}), EXACT (NORM, 2,2, {1,0}, NONE, 0, {1,0}), APPROX(NORM, 2,2, {3,4}, NONE, 0, {0.6,0.8}), EXACT (NORM, 2,2, {1e-20,1e-20}, NONE, 0, {0,0}), EXACT (NORM, 3,3, {0,0,0}, NONE, 0, {0,0,0}), EXACT (NORM, 3,3, {0,0,1}, NONE, 0, {0,0,1}), EXACT (NORM, 3,3, {0,1,0}, NONE, 0, {0,1,0}), EXACT (NORM, 3,3, {1,0,0}, NONE, 0, {1,0,0}), APPROX(NORM, 3,3, {2,4,4}, NONE, 0, {0.333333333,0.666666667,0.666666667}), EXACT (NORM, 3,3, {1e-20,1e-20,1e-20}, NONE, 0, {0,0,0}), EXACT (NORM, 4,4, {0,0,0,0}, NONE, 0, {0,0,0,0}), EXACT (NORM, 4,4, {0,0,0,1}, NONE, 0, {0,0,0,1}), EXACT (NORM, 4,4, {0,0,1,0}, NONE, 0, {0,0,1,0}), EXACT (NORM, 4,4, {0,1,0,0}, NONE, 0, {0,1,0,0}), EXACT (NORM, 4,4, {1,0,0,0}, NONE, 0, {1,0,0,0}), EXACT (NORM, 4,4, {1,1,1,1}, NONE, 0, {0.5,0.5,0.5,0.5}), EXACT (NORM, 4,4, {1e-20,1e-20,1e-20,1e-20}, NONE, 0, {0,0,0,0}), EXACT (SETLEN, 2,2, {0,0}, NONE, 1, {0,0}), EXACT (SETLEN, 2,2, {0,1}, NONE, 1, {0,1}), EXACT (SETLEN, 2,2, {1,0}, NONE, 1, {1,0}), APPROX(SETLEN, 2,2, {3,4}, NONE, 1, {0.6,0.8}), EXACT (SETLEN, 2,2, {0,1}, NONE, 2, {0,2}), EXACT (SETLEN, 2,2, {1,0}, NONE, 2, {2,0}), APPROX(SETLEN, 2,2, {3,4}, NONE, 2, {1.2,1.6}), EXACT (SETLEN, 2,2, {0,1}, NONE, 0.5, {0,0.5}), EXACT (SETLEN, 2,2, {1,0}, NONE, 0.5, {0.5,0}), APPROX(SETLEN, 2,2, {3,4}, NONE, 0.5, {0.3,0.4}), EXACT (SETLEN, 2,2, {1e-20,1e-20}, NONE, 1, {0,0}), EXACT (SETLEN, 3,3, {0,0,0}, NONE, 1, {0,0,0}), EXACT (SETLEN, 3,3, {0,0,1}, NONE, 1, {0,0,1}), EXACT (SETLEN, 3,3, {0,1,0}, NONE, 1, {0,1,0}), EXACT (SETLEN, 3,3, {1,0,0}, NONE, 1, {1,0,0}), APPROX(SETLEN, 3,3, {2,4,4}, NONE, 1, {0.333333333,0.666666667,0.666666667}), EXACT (SETLEN, 3,3, {0,0,1}, NONE, 3, {0,0,3}), EXACT (SETLEN, 3,3, {0,1,0}, NONE, 3, {0,3,0}), EXACT (SETLEN, 3,3, {1,0,0}, NONE, 3, {3,0,0}), EXACT (SETLEN, 3,3, {2,4,4}, NONE, 3, {1,2,2}), EXACT (SETLEN, 3,3, {0,0,1}, NONE, 0.5, {0,0,0.5}), EXACT (SETLEN, 3,3, {0,1,0}, NONE, 0.5, {0,0.5,0}), EXACT (SETLEN, 3,3, {1,0,0}, NONE, 0.5, {0.5,0,0}), APPROX(SETLEN, 3,3, {2,4,4}, NONE, 0.5, {0.166666667,0.333333333,0.333333333}), EXACT (SETLEN, 3,3, {1e-20,1e-20,1e-20}, NONE, 1, {0,0,0}), EXACT (SETLEN, 4,4, {0,0,0,0}, NONE, 1, {0,0,0,0}), EXACT (SETLEN, 4,4, {0,0,0,1}, NONE, 1, {0,0,0,1}), EXACT (SETLEN, 4,4, {0,0,1,0}, NONE, 1, {0,0,1,0}), EXACT (SETLEN, 4,4, {0,1,0,0}, NONE, 1, {0,1,0,0}), EXACT (SETLEN, 4,4, {1,0,0,0}, NONE, 1, {1,0,0,0}), EXACT (SETLEN, 4,4, {1,1,1,1}, NONE, 1, {0.5,0.5,0.5,0.5}), EXACT (SETLEN, 4,4, {0,0,0,1}, NONE, 1.5, {0,0,0,1.5}), EXACT (SETLEN, 4,4, {0,0,1,0}, NONE, 1.5, {0,0,1.5,0}), EXACT (SETLEN, 4,4, {0,1,0,0}, NONE, 1.5, {0,1.5,0,0}), EXACT (SETLEN, 4,4, {1,0,0,0}, NONE, 1.5, {1.5,0,0,0}), EXACT (SETLEN, 4,4, {1,1,1,1}, NONE, 1.5, {0.75,0.75,0.75,0.75}), EXACT (SETLEN, 4,4, {0,0,0,1}, NONE, 0.5, {0,0,0,0.5}), EXACT (SETLEN, 4,4, {0,0,1,0}, NONE, 0.5, {0,0,0.5,0}), EXACT (SETLEN, 4,4, {0,1,0,0}, NONE, 0.5, {0,0.5,0,0}), EXACT (SETLEN, 4,4, {1,0,0,0}, NONE, 0.5, {0.5,0,0,0}), EXACT (SETLEN, 4,4, {1,1,1,1}, NONE, 0.5, {0.25,0.25,0.25,0.25}), EXACT (SETLEN, 4,4, {1e-20,1e-20,1e-20,1e-20}, NONE, 1, {0,0,0,0}), APPROX(CAPLEN, 2,2, {3,4}, NONE, 1, {0.6,0.8}), EXACT (CAPLEN, 2,2, {3,4}, NONE, 10, {3,4}), APPROX(CAPLEN, 3,3, {2,4,4}, NONE, 1, {0.333333333,0.666666667,0.666666667}), EXACT (CAPLEN, 3,3, {2,4,4}, NONE, 10, {2,4,4}), EXACT (CAPLEN, 4,4, {1,1,1,1}, NONE, 1, {0.5,0.5,0.5,0.5}), EXACT (CAPLEN, 4,4, {1,1,1,1}, NONE, 10, {1,1,1,1}), EXACT (DOT, 2,2, {0,0}, {0,0}, 0, {0}), EXACT (DOT, 2,2, {0,0}, {1,1}, 0, {0}), EXACT (DOT, 2,2, {0,1}, {0,1}, 0, {1}), EXACT (DOT, 2,2, {0,1}, {1,0}, 0, {0}), EXACT (DOT, 2,2, {1,0}, {0,1}, 0, {0}), EXACT (DOT, 2,2, {1,0}, {1,0}, 0, {1}), EXACT (DOT, 2,2, {1,1}, {1,1}, 0, {2}), EXACT (DOT, 2,2, {3,4}, {5,6}, 0, {39}), EXACT (DOT, 2,2, {3,4}, {5.5,6.5}, 0, {42.5}), EXACT (DOT, 3,3, {0,0,0}, {0,0,0}, 0, {0}), EXACT (DOT, 3,3, {0,0,0}, {1,1,1}, 0, {0}), EXACT (DOT, 3,3, {0,0,1}, {0,0,1}, 0, {1}), EXACT (DOT, 3,3, {0,0,1}, {0,1,0}, 0, {0}), EXACT (DOT, 3,3, {0,0,1}, {1,0,0}, 0, {0}), EXACT (DOT, 3,3, {0,1,0}, {0,0,1}, 0, {0}), EXACT (DOT, 3,3, {0,1,0}, {0,1,0}, 0, {1}), EXACT (DOT, 3,3, {0,1,0}, {1,0,0}, 0, {0}), EXACT (DOT, 3,3, {1,0,0}, {0,0,1}, 0, {0}), EXACT (DOT, 3,3, {1,0,0}, {0,1,0}, 0, {0}), EXACT (DOT, 3,3, {1,0,0}, {1,0,0}, 0, {1}), EXACT (DOT, 3,3, {1,1,1}, {1,1,1}, 0, {3}), EXACT (DOT, 3,3, {3,4,5}, {5,6,7}, 0, {74}), EXACT (DOT, 3,3, {3,4,5}, {5.5,6.5,7.5}, 0, {80}), EXACT (DOT, 4,4, {0,0,0,0}, {0,0,0,0}, 0, {0}), EXACT (DOT, 4,4, {0,0,0,0}, {1,1,1,1}, 0, {0}), EXACT (DOT, 4,4, {0,0,0,1}, {0,0,0,1}, 0, {1}), EXACT (DOT, 4,4, {0,0,0,1}, {0,0,1,0}, 0, {0}), EXACT (DOT, 4,4, {0,0,0,1}, {0,1,0,0}, 0, {0}), EXACT (DOT, 4,4, {0,0,0,1}, {1,0,0,0}, 0, {0}), EXACT (DOT, 4,4, {0,0,1,0}, {0,0,0,1}, 0, {0}), EXACT (DOT, 4,4, {0,0,1,0}, {0,0,1,0}, 0, {1}), EXACT (DOT, 4,4, {0,0,1,0}, {0,1,0,0}, 0, {0}), EXACT (DOT, 4,4, {0,0,1,0}, {1,0,0,0}, 0, {0}), EXACT (DOT, 4,4, {0,1,0,0}, {0,0,0,1}, 0, {0}), EXACT (DOT, 4,4, {0,1,0,0}, {0,0,1,0}, 0, {0}), EXACT (DOT, 4,4, {0,1,0,0}, {0,1,0,0}, 0, {1}), EXACT (DOT, 4,4, {0,1,0,0}, {1,0,0,0}, 0, {0}), EXACT (DOT, 4,4, {1,0,0,0}, {0,0,0,1}, 0, {0}), EXACT (DOT, 4,4, {1,0,0,0}, {0,0,1,0}, 0, {0}), EXACT (DOT, 4,4, {1,0,0,0}, {0,1,0,0}, 0, {0}), EXACT (DOT, 4,4, {1,0,0,0}, {1,0,0,0}, 0, {1}), EXACT (DOT, 4,4, {1,1,1,1}, {1,1,1,1}, 0, {4}), EXACT (DOT, 4,4, {3,4,5,6}, {5,6,7,8}, 0, {122}), EXACT (DOT, 4,4, {3,4,5,6}, {5.5,6.5,7.5,8.5}, 0, {131}), EXACT (LERP, 2,2, {2,7}, {5,1}, 0, {2,7}), EXACT (LERP, 2,2, {2,7}, {5,1}, 0.25, {2.75,5.5}), EXACT (LERP, 2,2, {2,7}, {5,1}, 1, {5,1}), EXACT (LERP, 2,2, {2,7}, {5,1}, 1.5, {6.5,-2}), EXACT (LERP, 2,2, {2,7}, {5,1}, -0.5, {0.5,10}), EXACT (LERP, 3,3, {2,7,3}, {5,1,6}, 0, {2,7,3}), EXACT (LERP, 3,3, {2,7,3}, {5,1,6}, 0.25, {2.75,5.5,3.75}), EXACT (LERP, 3,3, {2,7,3}, {5,1,6}, 1, {5,1,6}), EXACT (LERP, 3,3, {2,7,3}, {5,1,6}, 1.5, {6.5,-2,7.5}), EXACT (LERP, 3,3, {2,7,3}, {5,1,6}, -0.5, {0.5,10,1.5}), EXACT (LERP, 4,4, {2,7,3,8}, {5,1,6,2}, 0, {2,7,3,8}), EXACT (LERP, 4,4, {2,7,3,8}, {5,1,6,2}, 0.25, {2.75,5.5,3.75,6.5}), EXACT (LERP, 4,4, {2,7,3,8}, {5,1,6,2}, 1, {5,1,6,2}), EXACT (LERP, 4,4, {2,7,3,8}, {5,1,6,2}, 1.5, {6.5,-2,7.5,-1}), EXACT (LERP, 4,4, {2,7,3,8}, {5,1,6,2}, -0.5, {0.5,10,1.5,11}), EXACT (CROSS, 3,3, {0,0,0}, {0,0,0}, 0, {0,0,0}), EXACT (CROSS, 3,3, {0,0,1}, {0,0,1}, 0, {0,0,0}), EXACT (CROSS, 3,3, {0,0,1}, {0,1,0}, 0, {-1,0,0}), EXACT (CROSS, 3,3, {0,0,1}, {1,0,0}, 0, {0,1,0}), EXACT (CROSS, 3,3, {0,1,0}, {0,0,1}, 0, {1,0,0}), EXACT (CROSS, 3,3, {0,1,0}, {0,1,0}, 0, {0,0,0}), EXACT (CROSS, 3,3, {0,1,0}, {1,0,0}, 0, {0,0,-1}), EXACT (CROSS, 3,3, {1,0,0}, {0,0,1}, 0, {0,-1,0}), EXACT (CROSS, 3,3, {1,0,0}, {0,1,0}, 0, {0,0,1}), EXACT (CROSS, 3,3, {1,0,0}, {1,0,0}, 0, {0,0,0}), EXACT (CROSS, 3,3, {1.5,2.5,3.5}, {4.25,5.5,7.75}, 0, {0.125,3.25,-2.375}), }; int lenof_vector_tests(void) {return lenof(vector_tests);} /*-----------------------------------------------------------------------*/ const VectorCross4Test vector_cross4_tests[] = { {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}}, {{0,0,0,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,0}}, {{0,0,0,1}, {0,0,0,1}, {0,0,1,0}, {0,0,0,0}}, {{0,0,0,1}, {0,0,0,1}, {0,1,0,0}, {0,0,0,0}}, {{0,0,0,1}, {0,0,0,1}, {1,0,0,0}, {0,0,0,0}}, {{0,0,0,1}, {0,0,1,0}, {0,0,0,1}, {0,0,0,0}}, {{0,0,0,1}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0}}, {{0,0,0,1}, {0,0,1,0}, {0,1,0,0}, {-1,0,0,0}}, {{0,0,0,1}, {0,0,1,0}, {1,0,0,0}, {0,1,0,0}}, {{0,0,0,1}, {0,1,0,0}, {0,0,0,1}, {0,0,0,0}}, {{0,0,0,1}, {0,1,0,0}, {0,0,1,0}, {1,0,0,0}}, {{0,0,0,1}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,0,1}, {0,1,0,0}, {1,0,0,0}, {0,0,-1,0}}, {{0,0,0,1}, {1,0,0,0}, {0,0,0,1}, {0,0,0,0}}, {{0,0,0,1}, {1,0,0,0}, {0,0,1,0}, {0,-1,0,0}}, {{0,0,0,1}, {1,0,0,0}, {0,1,0,0}, {0,0,1,0}}, {{0,0,0,1}, {1,0,0,0}, {1,0,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,0,0,1}, {0,0,0,1}, {0,0,0,0}}, {{0,0,1,0}, {0,0,0,1}, {0,0,1,0}, {0,0,0,0}}, {{0,0,1,0}, {0,0,0,1}, {0,1,0,0}, {1,0,0,0}}, {{0,0,1,0}, {0,0,0,1}, {1,0,0,0}, {0,-1,0,0}}, {{0,0,1,0}, {0,0,1,0}, {0,0,0,1}, {0,0,0,0}}, {{0,0,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0}}, {{0,0,1,0}, {0,0,1,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,0,1,0}, {1,0,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,1,0,0}, {0,0,0,1}, {-1,0,0,0}}, {{0,0,1,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,0}}, {{0,0,1,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}}, {{0,0,1,0}, {0,1,0,0}, {1,0,0,0}, {0,0,0,1}}, {{0,0,1,0}, {1,0,0,0}, {0,0,0,1}, {0,1,0,0}}, {{0,0,1,0}, {1,0,0,0}, {0,0,1,0}, {0,0,0,0}}, {{0,0,1,0}, {1,0,0,0}, {0,1,0,0}, {0,0,0,-1}}, {{0,0,1,0}, {1,0,0,0}, {1,0,0,0}, {0,0,0,0}}, {{0,1,0,0}, {0,0,0,1}, {0,0,0,1}, {0,0,0,0}}, {{0,1,0,0}, {0,0,0,1}, {0,0,1,0}, {-1,0,0,0}}, {{0,1,0,0}, {0,0,0,1}, {0,1,0,0}, {0,0,0,0}}, {{0,1,0,0}, {0,0,0,1}, {1,0,0,0}, {0,0,1,0}}, {{0,1,0,0}, {0,0,1,0}, {0,0,0,1}, {1,0,0,0}}, {{0,1,0,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0}}, {{0,1,0,0}, {0,0,1,0}, {0,1,0,0}, {0,0,0,0}}, {{0,1,0,0}, {0,0,1,0}, {1,0,0,0}, {0,0,0,-1}}, {{0,1,0,0}, {0,1,0,0}, {0,0,0,1}, {0,0,0,0}}, {{0,1,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}}, {{0,1,0,0}, {0,1,0,0}, {1,0,0,0}, {0,0,0,0}}, {{0,1,0,0}, {1,0,0,0}, {0,0,0,1}, {0,0,-1,0}}, {{0,1,0,0}, {1,0,0,0}, {0,0,1,0}, {0,0,0,1}}, {{0,1,0,0}, {1,0,0,0}, {0,1,0,0}, {0,0,0,0}}, {{0,1,0,0}, {1,0,0,0}, {1,0,0,0}, {0,0,0,0}}, {{1,0,0,0}, {0,0,0,1}, {0,0,0,1}, {0,0,0,0}}, {{1,0,0,0}, {0,0,0,1}, {0,0,1,0}, {0,1,0,0}}, {{1,0,0,0}, {0,0,0,1}, {0,1,0,0}, {0,0,-1,0}}, {{1,0,0,0}, {0,0,0,1}, {1,0,0,0}, {0,0,0,0}}, {{1,0,0,0}, {0,0,1,0}, {0,0,0,1}, {0,-1,0,0}}, {{1,0,0,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0}}, {{1,0,0,0}, {0,0,1,0}, {0,1,0,0}, {0,0,0,1}}, {{1,0,0,0}, {0,0,1,0}, {1,0,0,0}, {0,0,0,0}}, {{1,0,0,0}, {0,1,0,0}, {0,0,0,1}, {0,0,1,0}}, {{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,-1}}, {{1,0,0,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}}, {{1,0,0,0}, {0,1,0,0}, {1,0,0,0}, {0,0,0,0}}, {{1,0,0,0}, {1,0,0,0}, {0,0,0,1}, {0,0,0,0}}, {{1,0,0,0}, {1,0,0,0}, {0,0,1,0}, {0,0,0,0}}, {{1,0,0,0}, {1,0,0,0}, {0,1,0,0}, {0,0,0,0}}, {{1,0,0,0}, {1,0,0,0}, {1,0,0,0}, {0,0,0,0}}, {{1.5,2.5,3.5,4.5}, {5.25,-6.75,7.25,-8.75}, {-9,-10,-11.5,-12.5}, {208.375,-240.375,-153.375,183.375}}, }; int lenof_vector_cross4_tests(void) {return lenof(vector_cross4_tests);} /*-----------------------------------------------------------------------*/ const MatrixTest matrix_tests[] = { /* Unary + and negation */ {PLUS, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, .res = {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}}, {NEG, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, .res = {-1,-2,-3,-4, -5,-6,-7,-8, -9,-10,-11,-12, -13,-14,-15,-16}}, /* Addition */ {ADD, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {5.5,7.5,9.5,11.5, 13.5,15.5,17.5,19.5, 21.5,23.5,25.5,27.5, 29.5,31.5,33.5,35.5}, {6.5,9.5,12.5,15.5, 18.5,21.5,24.5,27.5, 30.5,33.5,36.5,39.5, 42.5,45.5,48.5,51.5}}, {ADD, 4, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {TINY,TINY,TINY,TINY, TINY,TINY,TINY,TINY, TINY,TINY,TINY,TINY, TINY,TINY,TINY,TINY}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}}, /* Subtraction */ {SUB, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {5.5,7.5,9.5,11.5, 13.5,15.5,17.5,19.5, 21.5,23.5,25.5,27.5, 29.5,31.5,33.5,35.5}, {-4.5,-5.5,-6.5,-7.5, -8.5,-9.5,-10.5,-11.5, -12.5,-13.5,-14.5,-15.5, -16.5,-17.5,-18.5,-19.5}}, {SUB, 4, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {TINY/2,TINY/2,TINY/2,TINY/2, TINY/2,TINY/2,TINY/2,TINY/2, TINY/2,TINY/2,TINY/2,TINY/2, TINY/2,TINY/2,TINY/2,TINY/2}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}}, /* Multiplication (basic tests) */ {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, /* Multiplication (tests for each element) */ {MUL, 4, {1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {2,3,4,5, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {2,3,4,5, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 2,3,4,5, 1,1,1,1, 1,1,1,1}, {2,3,4,5, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 2,3,4,5, 1,1,1,1}, {2,3,4,5, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,1, 0,0,0,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 2,3,4,5}, {2,3,4,5, 0,0,0,0, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 1,0,0,0, 0,0,0,0, 0,0,0,0}, {2,3,4,5, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 2,3,4,5, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 2,3,4,5, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 2,3,4,5, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 2,3,4,5, 1,1,1,1}, {0,0,0,0, 2,3,4,5, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,1, 0,0,0,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 2,3,4,5}, {0,0,0,0, 2,3,4,5, 0,0,0,0, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,0}, {2,3,4,5, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 2,3,4,5, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0}, {1,1,1,1, 2,3,4,5, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 2,3,4,5, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 2,3,4,5, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 2,3,4,5, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 2,3,4,5}, {0,0,0,0, 0,0,0,0, 2,3,4,5, 0,0,0,0}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,0,0}, {2,3,4,5, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 2,3,4,5}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,1,0,0}, {1,1,1,1, 2,3,4,5, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 2,3,4,5}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,1,0}, {1,1,1,1, 1,1,1,1, 2,3,4,5, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 2,3,4,5}}, {MUL, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 2,3,4,5}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 2,3,4,5}}, /* Multiplication (identity matrix tests) */ {MUL, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}}, {MUL, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}}, {MUL, 4, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}}, /* Multiplication (general tests) */ {MUL, 4, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4}}, {MUL, 4, {1,3,5,7, 9,11,13,15, 17,19,21,23, 25,27,29,31}, {2,4,6,8, 10,12,14,16, 18,20,22,24, 26,28,30,32}, {304,336,368,400, 752,848,944,1040, 1200,1360,1520,1680, 1648,1872,2096,2320}}, {MUL, 4, {1,3,5,7, 9,11,13,15, 17,19,21,23, 25,27,29,31}, {2.5,4.5,6.5,8.5, 10.5,12.5,14.5,16.5, 18.5,20.5,22.5,24.5, 26.5,28.5,30.5,32.5}, {312,344,376,408, 776,872,968,1064, 1240,1400,1560,1720, 1704,1928,2152,2376}}, /* Matrix transposition */ {TRANS, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, .res = {1,5,9,13, 2,6,10,14, 3,7,11,15, 4,8,12,16}}, /* Matrix inversion (identity matrix) */ {INV, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, .res = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}}, /* Matrix inversion (noninvertible matrix) */ {INV, 4, {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, .b = {._11=1}}, {INV, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 2,2,2,0}, .b = {._11=1}}, {INV, 4, {1,0,0,0, 0,1,0,0, 2,2,0,2, 0,0,0,1}, .b = {._11=1}}, {INV, 4, {1,0,0,0, 2,0,2,2, 0,0,1,0, 0,0,0,1}, .b = {._11=1}}, {INV, 4, {0,2,2,2, 0,1,0,0, 0,0,1,0, 0,0,0,1}, .b = {._11=1}}, /* Matrix inversion (invertible matrix) */ {INV, 4, {2,0,0,0, 0,4,0,0, 0,0,8,0, -6,-20,-56,1}, .res = {0.5,0,0,0, 0,0.25,0,0, 0,0,0.125,0, 3,5,7,1}}, /* Transform matrix translation */ {XLATE, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 3,5,7}, {1,0,0,0, 0,1,0,0, 0,0,1,0, 3,5,7,1}}, {XLATE, 4, {2,0,0,0, 0,4,0,0, 0,0,8,0, 0,0,0,1}, {._11 = 3,5,7}, {2,0,0,0, 0,4,0,0, 0,0,8,0, 6,20,56,1}}, {XLATE, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {._11 = 3,5,7}, {1,2,3,4, 5,6,7,8, 9,10,11,12, 104,120,136,152}}, /* Transform matrix rotation */ {ROT, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 1,0,0,90}, {1,0,0,0, 0,0,-1,0, 0,1,0,0, 0,0,0,1}}, {ROT, 4, {1,2,3,0, 4,5,6,0, 7,8,9,0, 0,0,0,1}, {._11 = 1,0,0,60}, {1,2,3,0, -4.0621777,-4.4282031,-4.7942285,0, 6.9641016,8.3301269,9.6961523,0, 0,0,0,1}}, {ROT, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {._11 = 1,0,0,90}, {1,2,3,4, -9,-10,-11,-12, 5,6,7,8, 13,14,15,16}}, {ROT, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 0,1,0,90}, {0,0,1,0, 0,1,0,0, -1,0,0,0, 0,0,0,1}}, {ROT, 4, {1,2,3,0, 4,5,6,0, 7,8,9,0, 0,0,0,1}, {._11 = 0,1,0,60}, {6.5621777,7.9282031,9.2942285,0, 4,5,6,0, 2.6339746,2.2679492,1.9019238,0, 0,0,0,1}}, {ROT, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {._11 = 0,1,0,90}, {9,10,11,12, 5,6,7,8, -1,-2,-3,-4, 13,14,15,16}}, {ROT, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 0,0,1,90}, {0,-1,0,0, 1,0,0,0, 0,0,1,0, 0,0,0,1}}, {ROT, 4, {1,2,3,0, 4,5,6,0, 7,8,9,0, 0,0,0,1}, {._11 = 0,0,1,60}, {-2.9641016,-3.3301269,-3.6961523,0, 2.8660254,4.2320508,5.5980762,0, 7,8,9,0, 0,0,0,1}}, {ROT, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {._11 = 0,0,1,90}, {-5,-6,-7,-8, 1,2,3,4, 9,10,11,12, 13,14,15,16}}, {ROT, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 1,4,8,60}, {0.50617283, -0.74510899, 0.43428289, 0, 0.79449170, 0.59876543, 0.10130582, 0, -0.33551746, 0.29375591, 0.89506173, 0, 0, 0, 0, 1}}, /* Transform matrix scaling */ {SCALE, 4, {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}, {._11 = 3,5,7}, {3,0,0,0, 0,5,0,0, 0,0,7,0, 0,0,0,1}}, {SCALE, 4, {2,0,0,0, 0,4,0,0, 0,0,8,0, 2,4,8,1}, {._11 = 3,5,7}, {6,0,0,0, 0,20,0,0, 0,0,56,0, 2,4,8,1}}, {SCALE, 4, {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}, {._11 = 3,5,7}, {3,6,9,12, 25,30,35,40, 63,70,77,84, 13,14,15,16}}, }; int lenof_matrix_tests(void) {return lenof(matrix_tests);} /*-----------------------------------------------------------------------*/ const TransformTest transform_tests[] = { {2, {2,3}, {1,0,0,0}, {2,3}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}, {2, {2,3}, {2,0,0,0}, {4,6}, {0,2,0,0}, {0,0,2,0}, {0,0,0,1}}, {2, {2,3}, {1,0,0,0}, {5,7}, {0,1,0,0}, {0,0,1,0}, {3,4,5,1}}, {2, {2,3}, {1.5,2.5,3.5,0}, {6.5,10.5}, {4.5,5.5,6.5,0}, {7.5,8.5,9.5,0}, {-10,-11,-12,1}}, {3, {2,3,4}, {1,0,0,0}, {2,3,4}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}, {3, {2,3,4}, {2,0,0,0}, {4,6,8}, {0,2,0,0}, {0,0,2,0}, {0,0,0,1}}, {3, {2,3,4}, {1,0,0,0}, {5,7,9}, {0,1,0,0}, {0,0,1,0}, {3,4,5,1}}, {3, {2,3,4}, {1.5,2.5,3.5,0}, {36.5,44.5,52.5}, {4.5,5.5,6.5,0}, {7.5,8.5,9.5,0}, {-10,-11,-12,1}}, {4, {2,3,4,5}, {1,0,0,0}, {2,3,4,5}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}, {4, {2,3,4,5}, {2,0,0,0}, {4,6,8,5}, {0,2,0,0}, {0,0,2,0}, {0,0,0,1}}, {4, {2,3,4,5}, {1,0,0,0}, {17,23,29,5}, {0,1,0,0}, {0,0,1,0}, {3,4,5,1}}, {4, {2,3,4,5}, {1.5,2.5,3.5,0}, {-3.5,0.5,4.5,5}, {4.5,5.5,6.5,0}, {7.5,8.5,9.5,0}, {-10,-11,-12,1}}, }; int lenof_transform_tests(void) {return lenof(transform_tests);} /*************************************************************************/ /*********************** Internal helper functions ***********************/ /*************************************************************************/ int check_matrix_error(const Matrix4f *result, const Matrix4f *expect, const char *errmsg, ...) { PRECOND(result != NULL, return 0); PRECOND(expect != NULL, return 0); PRECOND(errmsg != NULL, return 0); if (result->_11 == expect->_11 && result->_12 == expect->_12 && result->_13 == expect->_13 && result->_14 == expect->_14 && result->_21 == expect->_21 && result->_22 == expect->_22 && result->_23 == expect->_23 && result->_24 == expect->_24 && result->_31 == expect->_31 && result->_32 == expect->_32 && result->_33 == expect->_33 && result->_34 == expect->_34 && result->_41 == expect->_41 && result->_42 == expect->_42 && result->_43 == expect->_43 && result->_44 == expect->_44) { return 1; // Test succeeded. } char msgbuf[1000]; va_list args; va_start(args, errmsg); vstrformat(msgbuf, sizeof(msgbuf), errmsg, args); va_end(args); FAIL("%s" "\n result: [%6.3f,%6.3f,%6.3f,%6.3f] expect: [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]", msgbuf, result->_11, result->_12, result->_13, result->_14, expect->_11, expect->_12, expect->_13, expect->_14, result->_21, result->_22, result->_23, result->_24, expect->_21, expect->_22, expect->_23, expect->_24, result->_31, result->_32, result->_33, result->_34, expect->_31, expect->_32, expect->_33, expect->_34, result->_41, result->_42, result->_43, result->_44, expect->_41, expect->_42, expect->_43, expect->_44); } /*-----------------------------------------------------------------------*/ int check_matrix_error_inexact(const Matrix4f *result, const Matrix4f *expect, const char *errmsg, ...) { PRECOND(result != NULL, return 0); PRECOND(expect != NULL, return 0); PRECOND(errmsg != NULL, return 0); if (fabsf(result->_11 - expect->_11) < 1.0e-6f && fabsf(result->_12 - expect->_12) < 1.0e-6f && fabsf(result->_13 - expect->_13) < 1.0e-6f && fabsf(result->_14 - expect->_14) < 1.0e-6f && fabsf(result->_21 - expect->_21) < 1.0e-6f && fabsf(result->_22 - expect->_22) < 1.0e-6f && fabsf(result->_23 - expect->_23) < 1.0e-6f && fabsf(result->_24 - expect->_24) < 1.0e-6f && fabsf(result->_31 - expect->_31) < 1.0e-6f && fabsf(result->_32 - expect->_32) < 1.0e-6f && fabsf(result->_33 - expect->_33) < 1.0e-6f && fabsf(result->_34 - expect->_34) < 1.0e-6f && fabsf(result->_41 - expect->_41) < 1.0e-6f && fabsf(result->_42 - expect->_42) < 1.0e-6f && fabsf(result->_43 - expect->_43) < 1.0e-6f && fabsf(result->_44 - expect->_44) < 1.0e-6f) { return 1; // Test succeeded. } char msgbuf[1000]; va_list args; va_start(args, errmsg); vstrformat(msgbuf, sizeof(msgbuf), errmsg, args); va_end(args); FAIL("%s" "\n result: [%6.3f,%6.3f,%6.3f,%6.3f] expect: [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]" "\n [%6.3f,%6.3f,%6.3f,%6.3f] [%6.3f,%6.3f,%6.3f,%6.3f]", msgbuf, result->_11, result->_12, result->_13, result->_14, expect->_11, expect->_12, expect->_13, expect->_14, result->_21, result->_22, result->_23, result->_24, expect->_21, expect->_22, expect->_23, expect->_24, result->_31, result->_32, result->_33, result->_34, expect->_31, expect->_32, expect->_33, expect->_34, result->_41, result->_42, result->_43, result->_44, expect->_41, expect->_42, expect->_43, expect->_44); } /*************************************************************************/ /*************************************************************************/