From 49936120cabc258cd55fea69fa7b1ec73a1c0816 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Mon, 17 Apr 2023 19:11:16 +0300 Subject: [PATCH] public: tests: add new test to check return values of Q_Architecture/PlatformStringByID and Q_buildnum --- public/tests/test_build.c | 177 ++++++++++++++++++++++++++++++++++++++ public/wscript | 1 + 2 files changed, 178 insertions(+) create mode 100644 public/tests/test_build.c diff --git a/public/tests/test_build.c b/public/tests/test_build.c new file mode 100644 index 00000000..b28c7641 --- /dev/null +++ b/public/tests/test_build.c @@ -0,0 +1,177 @@ +#include +#include "build.h" +#include "buildenums.h" +#include "crtlib.h" + +// THESE DEFINITIONS MUST NEVER CHANGE +static struct +{ + int id; + const char *string; +} expected_platforms[] = +{ +{ PLATFORM_WIN32, "win32" }, +{ PLATFORM_ANDROID, "android" }, +{ PLATFORM_LINUX_UNKNOWN, "linuxunkabi" }, +{ PLATFORM_LINUX, "linux" }, +{ PLATFORM_APPLE, "apple" }, +{ PLATFORM_FREEBSD, "freebsd" }, +{ PLATFORM_NETBSD, "netbsd" }, +{ PLATFORM_OPENBSD, "openbsd" }, +{ PLATFORM_EMSCRIPTEN, "emscripten" }, +{ PLATFORM_DOS4GW, "DOS4GW" }, +{ PLATFORM_HAIKU, "haiku" }, +{ PLATFORM_SERENITY, "serenity" }, +{ PLATFORM_IRIX, "irix" }, +{ PLATFORM_NSWITCH, "nswitch" }, +{ PLATFORM_PSVITA, "psvita" }, +}; + +static struct +{ + int id; + int abi; + int endianness; + int is64; + const char *string; +} expected_architectures[] = +{ +{ ARCHITECTURE_AMD64, 0, -1, -1, "amd64" }, +{ ARCHITECTURE_X86, 0, -1, -1, "i386" }, +{ ARCHITECTURE_E2K, 0, -1, -1, "e2k" }, +{ ARCHITECTURE_JS, 0, -1, -1, "javascript" }, + +// all possible MIPS names +{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, true, "mips64" }, +{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, false, "mips" }, +{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, true, "mips64el" }, +{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, false, "mipsel" }, + +// All ARM is little endian only (for now?) +// Arm64 is always arm64, no matter the version (for now) +// Arm64 don't care about hardfp bit +{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, +{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, true, "arm64" }, +{ ARCHITECTURE_ARM, 0 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, +{ ARCHITECTURE_ARM, 0, ENDIANNESS_LITTLE, true, "arm64" }, + +// ARMv6 and below don't care about hardfp bit +{ ARCHITECTURE_ARM, 4 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv4l" }, +{ ARCHITECTURE_ARM, 4, ENDIANNESS_LITTLE, false, "armv4l" }, +{ ARCHITECTURE_ARM, 5 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv5l" }, +{ ARCHITECTURE_ARM, 5, ENDIANNESS_LITTLE, false, "armv5l" }, +{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, +{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, +{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, +{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, + +// ARMv7 and ARMv8 in 32-bit mode, hardfp bit is important +{ ARCHITECTURE_ARM, 7 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv7hf" }, +{ ARCHITECTURE_ARM, 7, ENDIANNESS_LITTLE, false, "armv7l" }, +{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv8_32hf" }, +{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, false, "armv8_32l" }, + +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, true, "riscv64" }, +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, false, "riscv32" }, +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, true, "riscv64f" }, +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, false, "riscv32f" }, +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, true, "riscv64d" }, +{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, false, "riscv32d" }, +}; + +static int TestPlatformString( void ) +{ + int i; + + for( i = 0; i < sizeof( expected_platforms ) / sizeof( expected_platforms[0] ); i++ ) + { + if( Q_strcmp( Q_PlatformStringByID( expected_platforms[i].id ), expected_platforms[i].string )) + return i + 1; + } + + return 0; +} + +static qboolean TestArchitectureString_NoEndianness( int id, int abi, int is64, const char *string ) +{ + return !Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_LITTLE, is64 ), string ) && + !Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_BIG, is64 ), string ); +} + +static qboolean TestArchitectureString_No64( int id, int abi, int endianness, const char *string ) +{ + if( endianness == -1 ) + { + return TestArchitectureString_NoEndianness( id, abi, false, string ) && + TestArchitectureString_NoEndianness( id, abi, true, string ); + } + + return !Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, true ), string ) && + !Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, false ), string ); +} + +static int TestArchitectureString( void ) +{ + int i; + + for( i = 0; i < sizeof( expected_architectures ) / sizeof( expected_architectures[0] ); i++ ) + { + if( expected_architectures[i].is64 == -1 ) + { + if( !TestArchitectureString_No64( + expected_architectures[i].id, + expected_architectures[i].abi, + expected_architectures[i].endianness, + expected_architectures[i].string )) + return i + 1; + } + else if( expected_architectures[i].endianness == -1 ) + { + if( !TestArchitectureString_NoEndianness( + expected_architectures[i].id, + expected_architectures[i].abi, + expected_architectures[i].is64, + expected_architectures[i].string )) + { + abort(); + return i + 1; + } + } + else + { + if( Q_strcmp( Q_ArchitectureStringByID( + expected_architectures[i].id, + expected_architectures[i].abi, + expected_architectures[i].endianness, + expected_architectures[i].is64 + ), expected_architectures[i].string )) + return i + 1; + } + } + + return 0; +} + +int main( void ) +{ + int res; + + res = TestPlatformString(); + if( res != 0 ) + return res; + + res = TestArchitectureString(); + if( res != 0 ) + return res + 100; + + if( Q_buildnum_compat() != 4529 ) + return 200; + + if( Q_buildnum_date( "Apr 02 2015" ) != 1 ) + return 201; + + if( Q_buildnum_date( "Apr 17 2023" ) != 2938 ) + return 202; + + return EXIT_SUCCESS; +} diff --git a/public/wscript b/public/wscript index 6af14af2..2868c8ee 100644 --- a/public/wscript +++ b/public/wscript @@ -26,6 +26,7 @@ def build(bld): if bld.env.TESTS: tests = { 'strings': 'tests/test_strings.c', + 'build': 'tests/test_build.c', } for i in tests: