/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * ControlValue tests */ #include #include #include #include "test.h" using namespace std; using namespace libcamera; class ControlValueTest : public Test { protected: int run() { /* * None type. */ ControlValue value; if (!value.isNone() || value.isArray()) { cerr << "Empty value is non-null" << endl; return TestFail; } /* * Bool type. */ value.set(true); if (value.isNone() || value.isArray() || value.type() != ControlTypeBool) { cerr << "Control type mismatch after setting to bool" << endl; return TestFail; } if (value.get() != true) { cerr << "Control value mismatch after setting to bool" << endl; return TestFail; } if (value.toString() != "true") { cerr << "Control string mismatch after setting to bool" << endl; return TestFail; } std::array bools{ true, false }; value.set(Span(bools)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeBool) { cerr << "Control type mismatch after setting to bool array" << endl; return TestFail; } Span boolsResult = value.get>(); if (bools.size() != boolsResult.size() || !std::equal(bools.begin(), bools.end(), boolsResult.begin())) { cerr << "Control value mismatch after setting to bool" << endl; return TestFail; } if (value.toString() != "[ true, false ]") { cerr << "Control string mismatch after setting to bool array" << endl; return TestFail; } /* * Integer8 type. */ value.set(static_cast(42)); if (value.isNone() || value.isArray() || value.type() != ControlTypeByte) { cerr << "Control type mismatch after setting to uint8_t" << endl; return TestFail; } if (value.get() != 42) { cerr << "Control value mismatch after setting to uint8_t" << endl; return TestFail; } if (value.toString() != "42") { cerr << "Control string mismatch after setting to uint8_t" << endl; return TestFail; } std::array bytes{ 3, 14, 15, 9 }; value.set(Span(bytes)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeByte) { cerr << "Control type mismatch after setting to uint8_t array" << endl; return TestFail; } Span int8sResult = value.get>(); if (bytes.size() != int8sResult.size() || !std::equal(bytes.begin(), bytes.end(), int8sResult.begin())) { cerr << "Control value mismatch after setting to uint8_t array" << endl; return TestFail; } if (value.toString() != "[ 3, 14, 15, 9 ]") { cerr << "Control string mismatch after setting to uint8_t array" << endl; return TestFail; } /* * Unsigned Integer16 type. */ value.set(static_cast(42)); if (value.isNone() || value.isArray() || value.type() != ControlTypeUnsigned16) { cerr << "Control type mismatch after setting to uint16_t" << endl; return TestFail; } if (value.get() != 42) { cerr << "Control value mismatch after setting to uint16_t" << endl; return TestFail; } if (value.toString() != "42") { cerr << "Control string mismatch after setting to uint16_t" << endl; return TestFail; } std::array uint16s{ 3, 14, 15, 9 }; value.set(Span(uint16s)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeUnsigned16) { cerr << "Control type mismatch after setting to uint16_t array" << endl; return TestFail; } Span uint16sResult = value.get>(); if (uint16s.size() != uint16sResult.size() || !std::equal(uint16s.begin(), uint16s.end(), uint16sResult.begin())) { cerr << "Control value mismatch after setting to uint16_t array" << endl; return TestFail; } if (value.toString() != "[ 3, 14, 15, 9 ]") { cerr << "Control string mismatch after setting to uint16_t array" << endl; return TestFail; } /* * Unsigned Integer32 type. */ value.set(static_cast(42)); if (value.isNone() || value.isArray() || value.type() != ControlTypeUnsigned32) { cerr << "Control type mismatch after setting to uint32_t" << endl; return TestFail; } if (value.get() != 42) { cerr << "Control value mismatch after setting to uint32_t" << endl; return TestFail; } if (value.toString() != "42") { cerr << "Control string mismatch after setting to uint32_t" << endl; return TestFail; } std::array uint32s{ 3, 14, 15, 9 }; value.set(Span(uint32s)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeUnsigned32) { cerr << "Control type mismatch after setting to uint32_t array" << endl; return TestFail; } Span uint32sResult = value.get>(); if (uint32s.size() != uint32sResult.size() || !std::equal(uint32s.begin(), uint32s.end(), uint32sResult.begin())) { cerr << "Control value mismatch after setting to uint32_t array" << endl; return TestFail; } if (value.toString() != "[ 3, 14, 15, 9 ]") { cerr << "Control string mismatch after setting to uint32_t array" << endl; return TestFail; } /* * Integer32 type. */ value.set(0x42000000); if (value.isNone() || value.isArray() || value.type() != ControlTypeInteger32) { cerr << "Control type mismatch after setting to int32_t" << endl; return TestFail; } if (value.get() != 0x42000000) { cerr << "Control value mismatch after setting to int32_t" << endl; return TestFail; } if (value.toString() != "1107296256") { cerr << "Control string mismatch after setting to int32_t" << endl; return TestFail; } std::array int32s{ 3, 14, 15, 9 }; value.set(Span(int32s)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeInteger32) { cerr << "Control type mismatch after setting to int32_t array" << endl; return TestFail; } Span int32sResult = value.get>(); if (int32s.size() != int32sResult.size() || !std::equal(int32s.begin(), int32s.end(), int32sResult.begin())) { cerr << "Control value mismatch after setting to int32_t array" << endl; return TestFail; } if (value.toString() != "[ 3, 14, 15, 9 ]") { cerr << "Control string mismatch after setting to int32_t array" << endl; return TestFail; } /* * Integer64 type. */ value.set(static_cast(-42)); if (value.isNone() || value.isArray() || value.type() != ControlTypeInteger64) { cerr << "Control type mismatch after setting to int64_t" << endl; return TestFail; } if (value.get() != -42) { cerr << "Control value mismatch after setting to int64_t" << endl; return TestFail; } if (value.toString() != "-42") { cerr << "Control string mismatch after setting to int64_t" << endl; return TestFail; } std::array int64s{ 3, 14, 15, 9 }; value.set(Span(int64s)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeInteger64) { cerr << "Control type mismatch after setting to int64_t array" << endl; return TestFail; } Span int64sResult = value.get>(); if (int64s.size() != int64sResult.size() || !std::equal(int64s.begin(), int64s.end(), int64sResult.begin())) { cerr << "Control value mismatch after setting to int64_t array" << endl; return TestFail; } if (value.toString() != "[ 3, 14, 15, 9 ]") { cerr << "Control string mismatch after setting to int64_t array" << endl; return TestFail; } /* * Float type. */ value.set(-0.42f); if (value.isNone() || value.isArray() || value.type() != ControlTypeFloat) { cerr << "Control type mismatch after setting to float" << endl; return TestFail; } if (value.get() != -0.42f) { cerr << "Control value mismatch after setting to float" << endl; return TestFail; } if (value.toString() != "-0.420000") { cerr << "Control string mismatch after setting to float" << endl; return TestFail; } std::array floats{ 3.141593, 2.718282, 299792458.0 }; value.set(Span(floats)); if (value.isNone() || !value.isArray() || value.type() != ControlTypeFloat) { cerr << "Control type mismatch after setting to float array" << endl; return TestFail; } Span floatsResult = value.get>(); if (floats.size() != floatsResult.size() || !std::equal(floats.begin(), floats.end(), floatsResult.begin())) { cerr << "Control value mismatch after setting to float array" << endl; return TestFail; } /* * The string representation for the third value doesn't match * the value in the floats array above, due to limited precision * of the float type that can't properly represent the speed of * light. */ if (value.toString() != "[ 3.141593, 2.718282, 299792448.000000 ]") { cerr << "Control string mismatch after setting to float array" << endl; return TestFail; } /* * String type. */ std::string string{ "libcamera" }; value.set(string); if (value.isNone() || !value.isArray() || value.type() != ControlTypeString || value.numElements() != string.size()) { cerr << "Control type mismatch after setting to string" << endl; return TestFail; } if (value.get() != string) { cerr << "Control value mismatch after setting to string" << endl; return TestFail; } if (value.toString() != string) { cerr << "Control string mismatch after setting to string" << endl; return TestFail; } return TestPass; } }; TEST_REGISTER(ControlValueTest)