diff options
Diffstat (limited to 'src/intel/common/tests/genxml_test.c')
-rw-r--r-- | src/intel/common/tests/genxml_test.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/intel/common/tests/genxml_test.c b/src/intel/common/tests/genxml_test.c new file mode 100644 index 00000000000..85002929fca --- /dev/null +++ b/src/intel/common/tests/genxml_test.c @@ -0,0 +1,103 @@ +/* + * Copyright © 2019 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include "gen_decoder.h" + +static bool quiet = false; + +struct test_address { + uint64_t offset; +}; + +__attribute__((unused)) static uint64_t +_test_combine_address(void *data, void *location, + struct test_address address, uint32_t delta) +{ + return address.offset + delta; +} + +#define __gen_user_data void +#define __gen_combine_address _test_combine_address +#define __gen_address_type struct test_address + +#include "gentest_pack.h" + +static void +test_struct(struct gen_spec *spec) { + /* Fill struct fields and <group> tag */ + struct GEN9_TEST_STRUCT test1 = { + .number1 = 5, + .number2 = 1234, + }; + + for (int i = 0; i < 4; i++) { + test1.byte[i] = i * 10 + 5; + } + + /* Pack struct into a dw array */ + uint32_t dw[GEN9_TEST_STRUCT_length]; + GEN9_TEST_STRUCT_pack(NULL, dw, &test1); + + /* Now decode the packed struct, and make sure it matches the original */ + struct gen_group *group; + group = gen_spec_find_struct(spec, "TEST_STRUCT"); + + assert(group != NULL); + + if (!quiet) { + printf("\nTEST_STRUCT:\n"); + gen_print_group(stdout, group, 0, dw, 0, false); + } + + struct gen_field_iterator iter; + gen_field_iterator_init(&iter, group, dw, 0, false); + + while (gen_field_iterator_next(&iter)) { + int idx; + if (strcmp(iter.name, "number1") == 0) { + uint16_t number = iter.raw_value; + assert(number == test1.number1); + } else if (strcmp(iter.name, "number2") == 0) { + uint16_t number = iter.raw_value; + assert(number == test1.number2); + } else if (sscanf(iter.name, "byte[%d]", &idx) == 1) { + uint8_t number = iter.raw_value; + assert(number == test1.byte[idx]); + } + } +} + +int main(int argc, char **argv) +{ + struct gen_spec *spec = gen_spec_load_filename(GENXML_PATH); + + if (argc > 1 && strcmp(argv[1], "-quiet") == 0) + quiet = true; + + test_struct(spec); + + return 0; +} |