1 #include "iamf/common/utils/validation_utils.h"
2
3 /*
4 * Copyright (c) 2023, Alliance for Open Media. All rights reserved
5 *
6 * This source code is subject to the terms of the BSD 3-Clause Clear License
7 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
8 * License was not distributed with this source code in the LICENSE file, you
9 * can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
10 * Alliance for Open Media Patent License 1.0 was not distributed with this
11 * source code in the PATENTS file, you can obtain it at
12 * www.aomedia.org/license/patent.
13 */
14 #include <array>
15 #include <cstdint>
16 #include <functional>
17 #include <optional>
18 #include <vector>
19
20 #include "absl/status/status_matchers.h"
21 #include "absl/strings/string_view.h"
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24
25 namespace iamf_tools {
26 namespace {
27
28 using ::absl_testing::IsOk;
29 using ::testing::HasSubstr;
30 using ::testing::Not;
31
32 constexpr absl::string_view kOmitContext = "";
33 constexpr absl::string_view kCustomUserContext = "Custom User Context";
34 constexpr std::array<int, 4> kFourTestValues = {1, 2, 3, 4};
35
TEST(ValidateContainerSizeEqual,OkIfArgsAreEqual)36 TEST(ValidateContainerSizeEqual, OkIfArgsAreEqual) {
37 constexpr uint8_t kReportedSizeFour = 4;
38
39 EXPECT_THAT(ValidateContainerSizeEqual(kOmitContext, kFourTestValues,
40 kReportedSizeFour),
41 IsOk());
42 }
43
TEST(ValidateContainerSizeEqual,NotOkIfArgsAreNotEquals)44 TEST(ValidateContainerSizeEqual, NotOkIfArgsAreNotEquals) {
45 constexpr uint8_t kInaccurateSizeFive = 5;
46
47 EXPECT_FALSE(ValidateContainerSizeEqual(kOmitContext, kFourTestValues,
48 kInaccurateSizeFive)
49 .ok());
50 }
51
TEST(ValidateContainerSizeEqual,MessageContainsContextOnError)52 TEST(ValidateContainerSizeEqual, MessageContainsContextOnError) {
53 constexpr uint8_t kInaccurateSizeFive = 5;
54
55 EXPECT_THAT(ValidateContainerSizeEqual(kCustomUserContext, kFourTestValues,
56 kInaccurateSizeFive)
57 .message(),
58 HasSubstr(kCustomUserContext));
59 }
60
TEST(ValidateEqual,OkIfArgsAreEqual)61 TEST(ValidateEqual, OkIfArgsAreEqual) {
62 const auto kLeftArg = 123;
63 const auto kRightArg = 123;
64 EXPECT_THAT(ValidateEqual(kLeftArg, kRightArg, kOmitContext), IsOk());
65 }
66
TEST(ValidateEqual,NotOkIfArgsAreNotEqual)67 TEST(ValidateEqual, NotOkIfArgsAreNotEqual) {
68 const auto kLeftArg = 123;
69 const auto kUnequalRightArg = 223;
70 EXPECT_FALSE(ValidateEqual(kLeftArg, kUnequalRightArg, kOmitContext).ok());
71 }
72
TEST(ValidateNotEqual,OkIfArgsAreNotEqual)73 TEST(ValidateNotEqual, OkIfArgsAreNotEqual) {
74 const auto kLeftArg = 123;
75 const auto kRightArg = 124;
76 EXPECT_THAT(ValidateNotEqual(kLeftArg, kRightArg, kOmitContext), IsOk());
77 }
78
TEST(ValidateNotEqual,NotOkIfArgsAreEqual)79 TEST(ValidateNotEqual, NotOkIfArgsAreEqual) {
80 const auto kLeftArg = 123;
81 const auto kEqualRightArg = 123;
82 EXPECT_FALSE(ValidateNotEqual(kLeftArg, kEqualRightArg, kOmitContext).ok());
83 }
84
TEST(ValidateHasValue,OkIfArgHasValue)85 TEST(ValidateHasValue, OkIfArgHasValue) {
86 constexpr std::optional<int> kArg = 123;
87 EXPECT_THAT(ValidateHasValue(kArg, kOmitContext), IsOk());
88 }
89
TEST(ValidateHasValue,NotOkIfArgDoesNotHaveValue)90 TEST(ValidateHasValue, NotOkIfArgDoesNotHaveValue) {
91 constexpr std::optional<int> kArg = std::nullopt;
92 EXPECT_FALSE(ValidateHasValue(kArg, kOmitContext).ok());
93 }
94
TEST(ValidateUnique,OkIfArgsAreUnique)95 TEST(ValidateUnique, OkIfArgsAreUnique) {
96 const std::vector<int> kVectorWithUniqueValues = {1, 2, 3, 99};
97
98 EXPECT_THAT(ValidateUnique(kVectorWithUniqueValues.begin(),
99 kVectorWithUniqueValues.end(), kOmitContext),
100 IsOk());
101 }
102
TEST(ValidateUnique,NotOkIfArgsAreNotUnique)103 TEST(ValidateUnique, NotOkIfArgsAreNotUnique) {
104 const std::vector<int> kVectorWithDuplicateValues = {1, 2, 3, 99, 1};
105
106 EXPECT_FALSE(ValidateUnique(kVectorWithDuplicateValues.begin(),
107 kVectorWithDuplicateValues.end(), kOmitContext)
108 .ok());
109 }
110
TEST(ValidateInRange,OkIfValueInRange)111 TEST(ValidateInRange, OkIfValueInRange) {
112 EXPECT_THAT(ValidateInRange(0, {-1, 1}, kOmitContext), IsOk());
113 EXPECT_THAT(ValidateInRange(-1, {-1, 1}, kOmitContext), IsOk());
114 EXPECT_THAT(ValidateInRange(1, {-1, 1}, kOmitContext), IsOk());
115 EXPECT_THAT(ValidateInRange(1.1f, {1.0f, 1.2f}, kOmitContext), IsOk());
116 EXPECT_THAT(
117 ValidateInRange(uint8_t{254}, {uint8_t{253}, uint8_t{255}}, kOmitContext),
118 IsOk());
119 EXPECT_THAT(
120 ValidateInRange(int64_t{-0xFFFFFE},
121 {int64_t{-0xFFFFFF}, int64_t{-0xFFFF}}, kOmitContext),
122 IsOk());
123 }
124
TEST(ValidateInRange,InvalidIfValueOutOfRange)125 TEST(ValidateInRange, InvalidIfValueOutOfRange) {
126 EXPECT_THAT(ValidateInRange(2, {0, 1}, kOmitContext), Not(IsOk()));
127 EXPECT_THAT(ValidateInRange(-1, {0, 1}, kOmitContext), Not(IsOk()));
128 EXPECT_THAT(ValidateInRange(1.11f, {1.0f, 1.1f}, kOmitContext), Not(IsOk()));
129 EXPECT_THAT(
130 ValidateInRange(uint8_t{255}, {uint8_t{253}, uint8_t{254}}, kOmitContext),
131 Not(IsOk()));
132 EXPECT_THAT(
133 ValidateInRange(int64_t{-0xFFFE}, {int64_t{-0xFFFFFF}, int64_t{-0xFFFF}},
134 kOmitContext),
135 Not(IsOk()));
136 }
137
TEST(ValidateComparison,OkIfValidComparison)138 TEST(ValidateComparison, OkIfValidComparison) {
139 EXPECT_THAT(Validate(1, std::less{}, 2, kOmitContext), IsOk());
140 EXPECT_THAT(Validate(2.0f, std::greater{}, 1.0f, kOmitContext), IsOk());
141 EXPECT_THAT(Validate(2, std::greater_equal{}, 2, kOmitContext), IsOk());
142 EXPECT_THAT(Validate(1, std::equal_to{}, 1, kOmitContext), IsOk());
143 EXPECT_THAT(Validate(2, std::not_equal_to{}, 1, kOmitContext), IsOk());
144 }
145
TEST(ValidateComparison,InvalidIfInvalidComparison)146 TEST(ValidateComparison, InvalidIfInvalidComparison) {
147 EXPECT_THAT(Validate(2, std::less{}, 1, kOmitContext), Not(IsOk()));
148 EXPECT_THAT(Validate(1.0f, std::greater{}, 2.0f, kOmitContext), Not(IsOk()));
149 EXPECT_THAT(Validate(2, std::equal_to{}, 1, kOmitContext), Not(IsOk()));
150 EXPECT_THAT(Validate(1, std::not_equal_to{}, 1, kOmitContext), Not(IsOk()));
151 }
152
153 } // namespace
154 } // namespace iamf_tools
155