blob: e6d0abcf0842efcd2fd589ebd48a5495744c79e0 [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "attribute.h"
#include <iterator>
#include <string>
#include <type_traits>
#include <vector>
#include "frame.h"
#include <gtest/gtest.h>
namespace ipp {
namespace {
class CollectionTest : public testing::Test {
public:
CollectionTest() : frame_(Operation::Print_Job, Version::_1_1, 1) {
frame_.AddGroup(GroupTag::operation_attributes, coll_);
}
protected:
Frame frame_;
CollsView::iterator coll_;
};
TEST_F(CollectionTest, AddAttrOutOfBand) {
auto err = coll_->AddAttr("test", ValueTag::not_settable);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::not_settable);
}
TEST_F(CollectionTest, AddAttrEnumAsInt) {
auto err = coll_->AddAttr("test-enum", ValueTag::enum_, 1234);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test-enum");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::enum_);
int value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value, 1234);
}
TEST_F(CollectionTest, AddAttrString) {
auto err = coll_->AddAttr("abc123", ValueTag::mimeMediaType, "abc&123 DEF");
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("abc123");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::mimeMediaType);
std::string value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value, "abc&123 DEF");
}
TEST_F(CollectionTest, AddAttrStringWithLanguage) {
StringWithLanguage sl;
sl.language = "lang_def";
sl.value = "str value";
auto err = coll_->AddAttr("lang", ValueTag::textWithLanguage, sl);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("lang");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::textWithLanguage);
StringWithLanguage value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value.language, "lang_def");
EXPECT_EQ(value.value, "str value");
}
TEST_F(CollectionTest, AddAttrBool) {
auto err = coll_->AddAttr("test", true);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::boolean);
int value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value, 1);
}
TEST_F(CollectionTest, AddAttrInteger) {
auto err = coll_->AddAttr("test", -1234567890);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::integer);
int32_t value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value, -1234567890);
}
TEST_F(CollectionTest, AddAttrDateTime) {
DateTime dt;
dt.year = 2034;
dt.month = 6;
dt.day = 23;
dt.hour = 19;
dt.minutes = 59;
dt.deci_seconds = 7;
dt.UTC_hours = 5;
dt.UTC_minutes = 44;
auto err = coll_->AddAttr("test", dt);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::dateTime);
DateTime value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value.year, 2034);
EXPECT_EQ(value.month, 6);
EXPECT_EQ(value.day, 23);
EXPECT_EQ(value.hour, 19);
EXPECT_EQ(value.minutes, 59);
EXPECT_EQ(value.seconds, 0);
EXPECT_EQ(value.deci_seconds, 7);
EXPECT_EQ(value.UTC_direction, '+');
EXPECT_EQ(value.UTC_hours, 5);
EXPECT_EQ(value.UTC_minutes, 44);
}
TEST_F(CollectionTest, AddAttrResolution) {
Resolution res(123, 456, Resolution::Units::kDotsPerInch);
auto err = coll_->AddAttr("test", res);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::resolution);
Resolution value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value.xres, 123);
EXPECT_EQ(value.yres, 456);
EXPECT_EQ(value.units, Resolution::Units::kDotsPerInch);
}
TEST_F(CollectionTest, AddAttrRangeOfInteger) {
RangeOfInteger roi(-123, 456);
auto err = coll_->AddAttr("test", roi);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::rangeOfInteger);
RangeOfInteger value;
EXPECT_EQ(Code::kOK, attr->GetValue(0, value));
EXPECT_EQ(value.min_value, -123);
EXPECT_EQ(value.max_value, 456);
}
TEST_F(CollectionTest, AddAttrCollection) {
CollsView::iterator attr_coll;
auto err = coll_->AddAttr("test", attr_coll);
EXPECT_EQ(err, Code::kOK);
auto attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::collection);
EXPECT_EQ(attr->Colls().begin(), attr_coll);
}
TEST_F(CollectionTest, AddAttrCollections) {
CollsView colls;
Code err = coll_->AddAttr("test", 3, colls);
EXPECT_EQ(err, Code::kOK);
EXPECT_EQ(colls.size(), 3);
Collection::iterator attr = coll_->GetAttr("test");
ASSERT_NE(attr, coll_->end());
EXPECT_EQ(attr->Tag(), ValueTag::collection);
EXPECT_EQ(attr->Colls().begin(), colls.begin());
}
TEST_F(CollectionTest, AddAttrInvalidName) {
auto err = coll_->AddAttr("", true);
EXPECT_EQ(err, Code::kInvalidName);
}
TEST_F(CollectionTest, AddAttrNameConflict) {
auto err = coll_->AddAttr("test", true);
EXPECT_EQ(err, Code::kOK);
EXPECT_EQ(coll_->AddAttr("test", true), Code::kNameConflict);
EXPECT_EQ(coll_->AddAttr("test", ValueTag::unknown), Code::kNameConflict);
}
TEST_F(CollectionTest, AddAttrValueOutOfRange) {
auto err = coll_->AddAttr("aaa", ValueTag::boolean, -1);
EXPECT_EQ(err, Code::kValueOutOfRange);
EXPECT_EQ(coll_->GetAttr("aaa"), coll_->end());
}
TEST_F(CollectionTest, AddAttrInvalidValueTag) {
auto err = coll_->AddAttr("xxx", static_cast<ValueTag>(0x0f));
EXPECT_EQ(err, Code::kInvalidValueTag);
}
TEST_F(CollectionTest, AttributesOrder) {
EXPECT_EQ(coll_->AddAttr("a3", true), Code::kOK);
EXPECT_EQ(coll_->AddAttr("a1", false), Code::kOK);
EXPECT_EQ(coll_->AddAttr("a5", 1234), Code::kOK);
EXPECT_EQ(coll_->AddAttr("a4", ValueTag::no_value), Code::kOK);
EXPECT_EQ(coll_->AddAttr("a2", ValueTag::uri, "abcde"), Code::kOK);
Collection::const_iterator attr = coll_->cbegin();
EXPECT_EQ(attr->Name(), "a3");
++attr;
EXPECT_EQ(attr->Name(), "a1");
++attr;
EXPECT_EQ(attr->Name(), "a5");
++attr;
EXPECT_EQ(attr->Name(), "a4");
++attr;
EXPECT_EQ(attr->Name(), "a2");
++attr;
EXPECT_EQ(attr, coll_->cend());
}
TEST_F(CollectionTest, GetAttrFail) {
Collection::iterator it = coll_->GetAttr("abc");
EXPECT_EQ(it, coll_->end());
Collection::const_iterator itc =
static_cast<Collection::const_iterator>(coll_->GetAttr("abc"));
EXPECT_EQ(itc, coll_->end());
CollsView::const_iterator coll_const =
static_cast<CollsView::const_iterator>(coll_);
EXPECT_EQ(coll_const->GetAttr("abc"), coll_->end());
}
TEST_F(CollectionTest, GetAttrSuccess) {
coll_->AddAttr("abc", std::vector{true, false});
Collection::iterator it = coll_->GetAttr("abc");
ASSERT_NE(it, coll_->end());
EXPECT_EQ(it->Name(), "abc");
EXPECT_EQ(it->Tag(), ValueTag::boolean);
EXPECT_EQ(it->Size(), 2);
}
TEST_F(CollectionTest, GetAttrSuccessConst) {
coll_->AddAttr("abc", std::vector{true, false});
Collection::const_iterator it;
it = coll_->GetAttr("abc");
ASSERT_NE(it, coll_->end());
EXPECT_EQ(it->Name(), "abc");
EXPECT_EQ(it->Tag(), ValueTag::boolean);
EXPECT_EQ(it->Size(), 2);
}
TEST_F(CollectionTest, IteratorsForEmptyCollection) {
EXPECT_EQ(coll_->begin(), coll_->end());
EXPECT_EQ(coll_->cbegin(), coll_->cend());
CollsView::const_iterator coll_const =
static_cast<CollsView::const_iterator>(coll_);
EXPECT_EQ(coll_const->begin(), coll_const->end());
}
TEST_F(CollectionTest, IteratorsTwoElements) {
coll_->AddAttr("test", ValueTag::not_settable);
coll_->AddAttr("test2", ValueTag::keyword,
std::vector<std::string>{"ala", "ma", "kota"});
std::vector<Collection::iterator> v;
v.push_back(coll_->GetAttr("test"));
v.push_back(coll_->GetAttr("test2"));
size_t index = 0;
for (Attribute& attr : *coll_) {
ASSERT_LE(index, v.size());
EXPECT_EQ(&attr, &*v[index]);
++index;
}
EXPECT_EQ(index, v.size());
}
TEST_F(CollectionTest, IteratorsTwoElementsConst) {
coll_->AddAttr("test", ValueTag::not_settable);
coll_->AddAttr("test2", ValueTag::keyword,
std::vector<std::string>{"ala", "ma", "kota"});
const Collection& coll_const = *coll_;
std::vector<Collection::const_iterator> v;
v.push_back(coll_const.GetAttr("test"));
v.push_back(coll_const.GetAttr("test2"));
size_t index = 0;
for (const Attribute& attr : coll_const) {
ASSERT_LE(index, v.size());
EXPECT_EQ(&attr, &*v[index]);
++index;
}
EXPECT_EQ(index, v.size());
}
TEST_F(CollectionTest, IteratorTraits) {
using it_traits = std::iterator_traits<Collection::iterator>;
EXPECT_TRUE((std::is_same<it_traits::iterator_category,
std::bidirectional_iterator_tag>::value));
EXPECT_TRUE((std::is_same<it_traits::value_type, Attribute>::value));
EXPECT_TRUE((std::is_same<it_traits::difference_type, int>::value));
EXPECT_TRUE((std::is_same<it_traits::pointer, Attribute*>::value));
EXPECT_TRUE((std::is_same<it_traits::reference, Attribute&>::value));
using itc_traits = std::iterator_traits<Collection::const_iterator>;
EXPECT_TRUE((std::is_same<itc_traits::iterator_category,
std::bidirectional_iterator_tag>::value));
EXPECT_TRUE((std::is_same<itc_traits::value_type, const Attribute>::value));
EXPECT_TRUE((std::is_same<itc_traits::difference_type, int>::value));
EXPECT_TRUE((std::is_same<itc_traits::pointer, const Attribute*>::value));
EXPECT_TRUE((std::is_same<itc_traits::reference, const Attribute&>::value));
}
class AttributeTest : public testing::Test {
public:
AttributeTest() { frame_.AddGroup(GroupTag::operation_attributes, coll_); }
protected:
Frame frame_;
CollsView::iterator coll_;
};
TEST_F(AttributeTest, CollsWrongType) {
coll_->AddAttr("out-of-band", ValueTag::not_settable);
Attribute& attr = *coll_->GetAttr("out-of-band");
EXPECT_TRUE(attr.Colls().empty());
EXPECT_EQ(attr.Colls().size(), 0);
const Attribute& attr_const = attr;
EXPECT_TRUE(attr_const.Colls().empty());
EXPECT_EQ(attr_const.Colls().size(), 0);
}
TEST_F(AttributeTest, AddAttrWithLongName) {
Code code = coll_->AddAttr(std::string(32768, 'x'), ValueTag::no_value);
EXPECT_EQ(code, Code::kInvalidName);
code = coll_->AddAttr(std::string(32767, 'x'), ValueTag::no_value);
EXPECT_EQ(code, Code::kOK);
}
TEST_F(AttributeTest, AddAttrWithLongString) {
Code code = coll_->AddAttr("max_length", ValueTag::octetString,
std::string(32767, 'x'));
EXPECT_EQ(code, Code::kOK);
code = coll_->AddAttr("too_large", ValueTag::octetString,
std::string(32768, 'x'));
EXPECT_EQ(code, Code::kValueOutOfRange);
Collection::iterator it = coll_->begin();
ASSERT_NE(it, coll_->end());
EXPECT_EQ(it->Name(), "max_length");
++it;
EXPECT_EQ(it, coll_->end());
}
TEST_F(AttributeTest, SetValueLongString) {
coll_->AddAttr("test", ValueTag::nameWithoutLanguage, "");
Collection::iterator it = coll_->GetAttr("test");
ASSERT_NE(it, coll_->end());
EXPECT_EQ(it->SetValues(std::string(32768, 'x')), Code::kValueOutOfRange);
EXPECT_EQ(it->SetValues(std::string(32767, 'x')), Code::kOK);
EXPECT_EQ(
it->SetValues(std::vector<std::string>{"", std::string(32768, 'x')}),
Code::kValueOutOfRange);
EXPECT_EQ(
it->SetValues(std::vector<std::string>{"", std::string(32767, 'x')}),
Code::kOK);
}
TEST_F(AttributeTest, AddAttrWithLongStringWithLanguage) {
StringWithLanguage strlang_ok = {std::string(32763, 'x'), ""};
StringWithLanguage strlang_too_long = {std::string(32760, 'x'),
std::string(4, 'x')};
Code code =
coll_->AddAttr("max_length", ValueTag::nameWithLanguage, strlang_ok);
EXPECT_EQ(code, Code::kOK);
code =
coll_->AddAttr("too_large", ValueTag::nameWithLanguage, strlang_too_long);
EXPECT_EQ(code, Code::kValueOutOfRange);
}
TEST_F(AttributeTest, SetValueLongStringWithLanguage) {
coll_->AddAttr("test", ValueTag::textWithLanguage,
std::vector<StringWithLanguage>(2));
Collection::iterator it = coll_->GetAttr("test");
ASSERT_NE(it, coll_->end());
StringWithLanguage strlang_ok = {"", std::string(32763, 'x')};
StringWithLanguage strlang_too_long = {std::string(4, 'x'),
std::string(32760, 'x')};
EXPECT_EQ(it->SetValues(strlang_too_long), Code::kValueOutOfRange);
EXPECT_EQ(it->SetValues(strlang_ok), Code::kOK);
EXPECT_EQ(it->SetValues(
std::vector<StringWithLanguage>{strlang_ok, strlang_too_long}),
Code::kValueOutOfRange);
EXPECT_EQ(
it->SetValues(std::vector<StringWithLanguage>{strlang_ok, strlang_ok}),
Code::kOK);
}
class AttributeValuesTest : public AttributeTest {
public:
AttributeValuesTest() {
coll_->AddAttr("out_of_band", ValueTag::not_settable);
coll_->AddAttr("bool", ValueTag::boolean, true);
coll_->AddAttr("int32", ValueTag::integer, 123);
coll_->AddAttr("string", ValueTag::octetString, "str");
coll_->AddAttr("name", ValueTag::nameWithoutLanguage, "name");
coll_->AddAttr("string_lang", ValueTag::nameWithLanguage,
StringWithLanguage("val", "lang"));
coll_->AddAttr("date_time", ValueTag::dateTime, DateTime());
coll_->AddAttr("resolution", ValueTag::resolution, Resolution{123, 456});
coll_->AddAttr("range", ValueTag::rangeOfInteger, RangeOfInteger(0, 2));
attr_out_of_band_ = coll_->GetAttr("out_of_band");
attr_bool_ = coll_->GetAttr("bool");
attr_int32_ = coll_->GetAttr("int32");
attr_string_ = coll_->GetAttr("string");
attr_name_ = coll_->GetAttr("name");
attr_string_lang_ = coll_->GetAttr("string_lang");
attr_date_time_ = coll_->GetAttr("date_time");
attr_resolution_ = coll_->GetAttr("resolution");
attr_range_ = coll_->GetAttr("range");
}
protected:
template <typename ApiType>
void CompareGetValueWithGetValues();
Collection::iterator attr_out_of_band_;
Collection::iterator attr_bool_;
Collection::iterator attr_int32_;
Collection::iterator attr_name_;
Collection::iterator attr_string_;
Collection::iterator attr_string_lang_;
Collection::iterator attr_date_time_;
Collection::iterator attr_resolution_;
Collection::iterator attr_range_;
};
TEST_F(AttributeValuesTest, GetValuesVectorBool) {
std::vector<bool> v;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_name_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, std::vector<bool>{true});
}
TEST_F(AttributeValuesTest, GetValuesVectorInt32) {
std::vector<int32_t> v;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kOK);
EXPECT_EQ(v, std::vector<int32_t>{1});
EXPECT_EQ(attr_int32_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_name_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, std::vector<int32_t>{123});
}
TEST_F(AttributeValuesTest, GetValuesVectorString) {
std::vector<std::string> v, v2;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_name_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_string_->GetValues(v2), Code::kOK);
EXPECT_EQ(attr_string_lang_->GetValues(v2), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, std::vector<std::string>{"name"});
EXPECT_EQ(v2, std::vector<std::string>{"str"});
}
TEST_F(AttributeValuesTest, GetValuesVectorStringWithLanguage) {
std::vector<StringWithLanguage> v, v2;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_name_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v2), Code::kOK);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, std::vector<StringWithLanguage>{StringWithLanguage("name", "")});
EXPECT_EQ(v2,
std::vector<StringWithLanguage>{StringWithLanguage("val", "lang")});
}
TEST_F(AttributeValuesTest, GetValuesVectorDateTime) {
std::vector<DateTime> v;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_name_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, std::vector<DateTime>(1));
}
TEST_F(AttributeValuesTest, GetValuesVectorResolution) {
std::vector<Resolution> v;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_name_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_range_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(v, (std::vector<Resolution>{Resolution{123, 456}}));
}
TEST_F(AttributeValuesTest, GetValuesVectorRangeOfInteger) {
std::vector<RangeOfInteger> v, v2;
EXPECT_EQ(attr_out_of_band_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->GetValues(v), Code::kOK);
EXPECT_EQ(attr_name_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->GetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->GetValues(v2), Code::kOK);
EXPECT_EQ(v, (std::vector<RangeOfInteger>{RangeOfInteger(123, 123)}));
EXPECT_EQ(v2, (std::vector<RangeOfInteger>{RangeOfInteger(0, 2)}));
}
template <typename ApiType>
void AttributeValuesTest::CompareGetValueWithGetValues() {
const std::vector<ipp::Collection::iterator> attrs = {
attr_out_of_band_, attr_bool_, attr_int32_,
attr_name_, attr_string_, attr_string_lang_,
attr_date_time_, attr_resolution_, attr_range_};
for (ipp::Collection::iterator attr : attrs) {
ApiType x;
std::vector<ApiType> vx;
ipp::Code code = attr->GetValue(0, x);
ipp::Code vcode = attr->GetValues(vx);
EXPECT_EQ(code, vcode);
if (vcode == ipp::Code::kOK) {
EXPECT_EQ(x, vx[0]);
}
}
}
TEST_F(AttributeValuesTest, GetValueBool) {
CompareGetValueWithGetValues<bool>();
}
TEST_F(AttributeValuesTest, GetValueInt32) {
CompareGetValueWithGetValues<int32_t>();
}
TEST_F(AttributeValuesTest, GetValueString) {
CompareGetValueWithGetValues<std::string>();
}
TEST_F(AttributeValuesTest, GetValueStringWithLanguage) {
CompareGetValueWithGetValues<StringWithLanguage>();
}
TEST_F(AttributeValuesTest, GetValueDateTime) {
CompareGetValueWithGetValues<DateTime>();
}
TEST_F(AttributeValuesTest, GetValueResolution) {
CompareGetValueWithGetValues<Resolution>();
}
TEST_F(AttributeValuesTest, GetValueRangeOfInteger) {
CompareGetValueWithGetValues<RangeOfInteger>();
}
TEST_F(AttributeValuesTest, SetValuesBool) {
const bool v = true;
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<bool> v2;
EXPECT_EQ(attr_bool_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<bool>{v});
}
TEST_F(AttributeValuesTest, SetValuesInt32) {
const int32_t v = 1234;
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kValueOutOfRange);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<int32_t> v2;
EXPECT_EQ(attr_int32_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<int32_t>{v});
}
TEST_F(AttributeValuesTest, SetValuesString) {
const std::string v = "test";
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<std::string> v2;
EXPECT_EQ(attr_string_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<std::string>{v});
}
TEST_F(AttributeValuesTest, SetValuesStringWithLanguage) {
const StringWithLanguage v = {"testval", "testlang"};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<StringWithLanguage> v2;
EXPECT_EQ(attr_string_lang_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<StringWithLanguage>{v});
}
TEST_F(AttributeValuesTest, SetValuesDateTime) {
const DateTime v = {2022, 1, 2, 3, 4, 5};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<DateTime> v2;
EXPECT_EQ(attr_date_time_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<DateTime>{v});
}
TEST_F(AttributeValuesTest, SetValuesResolution) {
const Resolution v = {12, 34, Resolution::Units::kDotsPerCentimeter};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<Resolution> v2;
EXPECT_EQ(attr_resolution_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<Resolution>{v});
}
TEST_F(AttributeValuesTest, SetValuesRangeOfInteger) {
const RangeOfInteger v = {12, 34};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kOK);
std::vector<RangeOfInteger> v2;
EXPECT_EQ(attr_range_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, std::vector<RangeOfInteger>{v});
}
TEST_F(AttributeValuesTest, SetValuesVectorBool) {
const std::vector<bool> v = {true, false, true};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<bool> v2;
EXPECT_EQ(attr_bool_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorInt32) {
const std::vector<int32_t> v = {1, 2, 3, 4};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kValueOutOfRange);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<int32_t> v2;
EXPECT_EQ(attr_int32_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorString) {
const std::vector<std::string> v = {"test1", "test2", "test3"};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<std::string> v2;
EXPECT_EQ(attr_string_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorStringWithLanguage) {
const std::vector<StringWithLanguage> v = {{"v1", "l1"}, {"v2", "l2"}};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<StringWithLanguage> v2;
EXPECT_EQ(attr_string_lang_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorDateTime) {
const std::vector<DateTime> v = {{2022, 1, 2}, {2021, 3, 4}, {2023, 7, 8}};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<DateTime> v2;
EXPECT_EQ(attr_date_time_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorResolution) {
const std::vector<Resolution> v = {{12, 34}, {56, 78}, {90, 11}};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kOK);
EXPECT_EQ(attr_range_->SetValues(v), Code::kIncompatibleType);
std::vector<Resolution> v2;
EXPECT_EQ(attr_resolution_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST_F(AttributeValuesTest, SetValuesVectorRangeOfInteger) {
const std::vector<RangeOfInteger> v = {{0, 0}, {12, 34}, {999, 33}};
EXPECT_EQ(attr_out_of_band_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_bool_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_int32_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_string_lang_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_date_time_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_resolution_->SetValues(v), Code::kIncompatibleType);
EXPECT_EQ(attr_range_->SetValues(v), Code::kOK);
std::vector<RangeOfInteger> v2;
EXPECT_EQ(attr_range_->GetValues(v2), Code::kOK);
EXPECT_EQ(v2, v);
}
TEST(ToStrView, ValueTag) {
EXPECT_EQ(ToStrView(ValueTag::keyword), "keyword");
EXPECT_EQ(ToStrView(ValueTag::delete_attribute), "delete-attribute");
EXPECT_EQ(ToStrView(ValueTag::enum_), "enum");
EXPECT_EQ(ToStrView(ValueTag::nameWithoutLanguage), "nameWithoutLanguage");
}
} // namespace
} // namespace ipp