| // This file is automatically generated from |
| // frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py |
| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "shared.rsh" |
| |
| // Ensure that we can reflect correct Java code for a struct with |
| // multiple fields of type struct. Java sets the script global |
| // variable "outer", and then calls a verification invokable |
| // "checkOuter()", passing the expected field values as scalar |
| // arguments. |
| |
| struct InnerOne { |
| int x; |
| int y; |
| float f; |
| }; |
| |
| typedef struct InnerOne s_innerOne; |
| |
| struct InnerTwo { |
| int8_t z; |
| struct InnerOne innerOne; |
| }; |
| |
| struct Outer { |
| struct InnerOne innerOneA; |
| long l; // to induce padding |
| struct InnerOne innerOneB; |
| struct InnerTwo innerTwo3[3]; |
| struct InnerTwo innerTwo2[2]; |
| struct InnerOne innerOne4[4]; |
| s_innerOne innerOneC; // does a typedef confuse reflection? |
| }; |
| |
| struct Outer outer; |
| |
| // Fragment of incoming argument list: Fields for struct InnerOne. |
| // Arguments are named argPrefix"_x", argPrefix"_y", argPrefix"_f". |
| #define ARGS_INNERONE_(argPrefix) \ |
| int argPrefix ## _x, int argPrefix ## _y, float argPrefix ## _f |
| |
| // Fragment of incoming argument list: Fields for struct InnerOne |
| // within struct Outer. |
| // Arguments are named outerFieldName"_x", outerFieldName"_y", outerFieldName"_f". |
| #define ARGS_INNERONE_SCALAR(outerFieldName) \ |
| ARGS_INNERONE_(outerFieldName) |
| |
| // Fragment of incoming argument list: Fields for element of array of |
| // struct InnerOne within struct Outer. |
| // Arguments are named outerFieldName"_"index"_x", outerFieldName"_"index"_y", |
| // and outerFieldName"_"index"_f". |
| #define ARGS_INNERONE_ARRAY(outerFieldName, index) \ |
| ARGS_INNERONE_(outerFieldName ## _ ## index) |
| |
| // Fragment of incoming argument list: Fields for element of array of |
| // struct InnerTwo (with nested InnerOne flattened out) within struct Outer. |
| // Arguments are named outerFieldName"_"index"_z", outerFieldName"_"index"_innerOne_x", etc. |
| #define ARGS_INNERTWO_ARRAY(outerFieldName, index) \ |
| int8_t outerFieldName ## _ ## index ## _z, ARGS_INNERONE_(outerFieldName ## _ ## index ## _innerOne) |
| |
| // #define TRACE(...) rsDebug(__VA_ARGS__) |
| #define TRACE(...) (void)0 |
| |
| void checkOuter(ARGS_INNERONE_SCALAR(innerOneA), |
| long l, |
| ARGS_INNERONE_SCALAR(innerOneB), |
| ARGS_INNERTWO_ARRAY(innerTwo3, 0), |
| ARGS_INNERTWO_ARRAY(innerTwo3, 1), |
| ARGS_INNERTWO_ARRAY(innerTwo3, 2), |
| ARGS_INNERTWO_ARRAY(innerTwo2, 0), |
| ARGS_INNERTWO_ARRAY(innerTwo2, 1), |
| ARGS_INNERONE_ARRAY(innerOne4, 0), |
| ARGS_INNERONE_ARRAY(innerOne4, 1), |
| ARGS_INNERONE_ARRAY(innerOne4, 2), |
| ARGS_INNERONE_ARRAY(innerOne4, 3), |
| ARGS_INNERONE_SCALAR(innerOneC)) { |
| bool failed = false; |
| |
| // Compare contents of a struct InnerOne instance against incoming argument values. |
| // Compares instanceName".x" to argPrefix"_x", etc. |
| #define CHECK_INNERONE_(instanceName, argPrefix) \ |
| do { \ |
| TRACE(# instanceName, instanceName.x); \ |
| _RS_ASSERT(instanceName.x == argPrefix ## _x); \ |
| TRACE(# instanceName, instanceName.y); \ |
| _RS_ASSERT(instanceName.y == argPrefix ## _y); \ |
| TRACE(# instanceName, instanceName.f); \ |
| _RS_ASSERT(instanceName.f == argPrefix ## _f); \ |
| } while(false) |
| |
| // Compare contents of a struct InnerOne instance within global |
| // variable "outer" against incoming argument values. |
| // Compares "outer."outerFieldName".x" to outerFieldName"_x", etc. |
| #define CHECK_INNERONE_SCALAR(outerFieldName) \ |
| CHECK_INNERONE_(outer.outerFieldName, outerFieldName) |
| |
| // Compare contents of element of array of struct InnerOne |
| // instance within global variable "outer" against incoming argument values. |
| // Compares "outer"outerFieldName"["index"].x" to outerFieldName"_"index"_x", etc. |
| #define CHECK_INNERONE_ARRAY(outerFieldName, index) \ |
| CHECK_INNERONE_(outer.outerFieldName[index], outerFieldName ## _ ## index) |
| |
| // Compare contents of element of array of struct InnerTwo |
| // instance within global variable "outer" against incoming argument values. |
| // Compares "outer."outerFieldName"["index"].z" to outerFieldName"_"index"_z", |
| // "outer."outerFieldName"["index"].innerOne.x" to outerFieldName""index"_innerOne_x", |
| // etc. |
| #define CHECK_INNERTWO_ARRAY(outerFieldName, index) \ |
| do { \ |
| TRACE(# index, outer.outerFieldName[index].z); \ |
| _RS_ASSERT(outer.outerFieldName[index].z == outerFieldName ## _ ## index ## _z); \ |
| CHECK_INNERONE_(outer.outerFieldName[index].innerOne, outerFieldName ## _ ## index ## _innerOne); \ |
| } while (false); |
| |
| CHECK_INNERONE_SCALAR(innerOneA); |
| TRACE("l", outer.l); |
| _RS_ASSERT(outer.l == l); |
| CHECK_INNERONE_SCALAR(innerOneB); |
| CHECK_INNERTWO_ARRAY(innerTwo3, 0); |
| CHECK_INNERTWO_ARRAY(innerTwo3, 1); |
| CHECK_INNERTWO_ARRAY(innerTwo3, 2); |
| CHECK_INNERTWO_ARRAY(innerTwo2, 0); |
| CHECK_INNERTWO_ARRAY(innerTwo2, 1); |
| CHECK_INNERONE_ARRAY(innerOne4, 0); |
| CHECK_INNERONE_ARRAY(innerOne4, 1); |
| CHECK_INNERONE_ARRAY(innerOne4, 2); |
| CHECK_INNERONE_ARRAY(innerOne4, 3); |
| CHECK_INNERONE_SCALAR(innerOneC); |
| |
| if (failed) { |
| rsDebug("struct_field FAILED", 0); |
| rsSendToClientBlocking(RS_MSG_TEST_FAILED); |
| } |
| else { |
| rsDebug("struct_field PASSED", 0); |
| rsSendToClientBlocking(RS_MSG_TEST_PASSED); |
| } |
| } |