// Copyright 2019 Google LLC // // 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 // // https://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 "runtime/cpp/emboss_arithmetic.h" #include "gtest/gtest.h" namespace emboss { namespace support { // EXPECT_EQ uses operator==. For un-Known() Maybes, this follows the semantics // for operator==(std::optional, std::optional), which returns true if // neither argument has_value(). (It also matches Rust's Option and Haskell's // Maybe.) // // Given the name "Known", it arguably should follow NaN != NaN semantics // instead, but this is more useful for tests. template constexpr inline bool operator==(const Maybe &l, const Maybe &r) { return l.Known() == r.Known() && l.ValueOrDefault() == r.ValueOrDefault(); } namespace test { using ::std::int32_t; using ::std::int64_t; using ::std::uint32_t; using ::std::uint64_t; TEST(Sum, Sum) { EXPECT_EQ( Maybe(0), (Sum( Maybe(0), Maybe(0)))); EXPECT_EQ( Maybe(2147483647), (Sum( Maybe(2147483646), Maybe(1)))); EXPECT_EQ( Maybe(-2147483647 - 1), (Sum( Maybe(-2147483647), Maybe(-1)))); EXPECT_EQ(Maybe(2147483648U), (Sum(Maybe(2147483647), Maybe(1)))); EXPECT_EQ(Maybe(2147483647), (Sum(Maybe(2147483648U), Maybe(-1)))); EXPECT_EQ(Maybe(), (Sum(Maybe(), Maybe(-1)))); } TEST(Difference, Difference) { EXPECT_EQ(Maybe(0), (Difference(Maybe(0), Maybe(0)))); EXPECT_EQ(Maybe(2147483647), (Difference(Maybe(2147483646), Maybe(-1)))); EXPECT_EQ(Maybe(-2147483647 - 1), (Difference(Maybe(-2147483647), Maybe(1)))); EXPECT_EQ(Maybe(2147483648U), (Difference(Maybe(2147483647), Maybe(-1)))); EXPECT_EQ( Maybe(2147483647), (Difference(Maybe(2147483648U), Maybe(1)))); EXPECT_EQ( Maybe(-2147483647 - 1), (Difference(Maybe(1), Maybe(2147483649U)))); EXPECT_EQ(Maybe(), (Difference(Maybe(1), Maybe()))); } TEST(Product, Product) { EXPECT_EQ(Maybe(0), (Product(Maybe(0), Maybe(0)))); EXPECT_EQ(Maybe(-2147483646), (Product(Maybe(2147483646), Maybe(-1)))); EXPECT_EQ( Maybe(-2147483647 - 1), (Product(Maybe(-2147483647 - 1), Maybe(1)))); EXPECT_EQ(Maybe(2147483648U), (Product(Maybe(1073741824), Maybe(2)))); EXPECT_EQ(Maybe(), (Product(Maybe(), Maybe(2)))); } TEST(Equal, Equal) { EXPECT_EQ(Maybe(true), (Equal( Maybe(0), Maybe(0)))); EXPECT_EQ(Maybe(false), (Equal( Maybe(2147483646), Maybe(-1)))); EXPECT_EQ(Maybe(true), (Equal( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ(Maybe(false), (Equal( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ(Maybe(), (Equal( Maybe(), Maybe(2147483648U)))); } TEST(NotEqual, NotEqual) { EXPECT_EQ( Maybe(false), (NotEqual( Maybe(0), Maybe(0)))); EXPECT_EQ( Maybe(true), (NotEqual( Maybe(2147483646), Maybe(-1)))); EXPECT_EQ( Maybe(false), (NotEqual( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ( Maybe(true), (NotEqual( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ( Maybe(), (NotEqual( Maybe(-2147483648LL), Maybe()))); } TEST(LessThan, LessThan) { EXPECT_EQ( Maybe(false), (LessThan( Maybe(0), Maybe(0)))); EXPECT_EQ( Maybe(false), (LessThan( Maybe(2147483646), Maybe(-1)))); EXPECT_EQ( Maybe(false), (LessThan( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ( Maybe(true), (LessThan( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ( Maybe(), (LessThan( Maybe(), Maybe(2147483648U)))); } TEST(LessThanOrEqual, LessThanOrEqual) { EXPECT_EQ(Maybe(true), (LessThanOrEqual(Maybe(0), Maybe(0)))); EXPECT_EQ( Maybe(false), (LessThanOrEqual(Maybe(2147483646), Maybe(-1)))); EXPECT_EQ(Maybe(true), (LessThanOrEqual( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ(Maybe(true), (LessThanOrEqual( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ(Maybe(), (LessThanOrEqual( Maybe(), Maybe(2147483648U)))); } TEST(GreaterThan, GreaterThan) { EXPECT_EQ( Maybe(false), (GreaterThan( Maybe(0), Maybe(0)))); EXPECT_EQ( Maybe(true), (GreaterThan( Maybe(2147483646), Maybe(-1)))); EXPECT_EQ( Maybe(false), (GreaterThan( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ( Maybe(false), (GreaterThan( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ( Maybe(), (GreaterThan( Maybe(), Maybe(2147483648U)))); } TEST(GreaterThanOrEqual, GreaterThanOrEqual) { EXPECT_EQ(Maybe(true), (GreaterThanOrEqual( Maybe(0), Maybe(0)))); EXPECT_EQ(Maybe(true), (GreaterThanOrEqual( Maybe(2147483646), Maybe(-1)))); EXPECT_EQ(Maybe(true), (GreaterThanOrEqual( Maybe(2147483647), Maybe(2147483647)))); EXPECT_EQ(Maybe(false), (GreaterThanOrEqual( Maybe(-2147483648LL), Maybe(2147483648U)))); EXPECT_EQ(Maybe(), (GreaterThanOrEqual( Maybe(), Maybe(2147483648U)))); } TEST(And, And) { EXPECT_EQ(Maybe(true), (And( Maybe(true), Maybe(true)))); EXPECT_EQ(Maybe(), (And(Maybe(), Maybe(true)))); EXPECT_EQ(Maybe(), (And(Maybe(), Maybe()))); EXPECT_EQ(Maybe(), (And(Maybe(true), Maybe()))); EXPECT_EQ(Maybe(false), (And( Maybe(false), Maybe(true)))); EXPECT_EQ(Maybe(false), (And(Maybe(false), Maybe()))); EXPECT_EQ(Maybe(false), (And( Maybe(false), Maybe(false)))); EXPECT_EQ(Maybe(false), (And( Maybe(true), Maybe(false)))); EXPECT_EQ(Maybe(false), (And(Maybe(), Maybe(false)))); } TEST(Or, Or) { EXPECT_EQ(Maybe(false), (Or( Maybe(false), Maybe(false)))); EXPECT_EQ(Maybe(), (Or(Maybe(), Maybe(false)))); EXPECT_EQ(Maybe(), (Or(Maybe(), Maybe()))); EXPECT_EQ(Maybe(), (Or(Maybe(false), Maybe()))); EXPECT_EQ(Maybe(true), (Or(Maybe(false), Maybe(true)))); EXPECT_EQ(Maybe(true), (Or(Maybe(true), Maybe()))); EXPECT_EQ(Maybe(true), (Or(Maybe(true), Maybe(true)))); EXPECT_EQ(Maybe(true), (Or( Maybe(true), Maybe(false)))); EXPECT_EQ(Maybe(true), (Or(Maybe(), Maybe(true)))); } TEST(Choice, Choice) { EXPECT_EQ(Maybe(), (Choice( Maybe(), Maybe(1), Maybe(2)))); EXPECT_EQ(Maybe(1), (Choice(Maybe(true), Maybe(1), Maybe(2)))); EXPECT_EQ(Maybe(2), (Choice(Maybe(false), Maybe(1), Maybe(2)))); EXPECT_EQ(Maybe(), (Choice( Maybe(true), Maybe(), Maybe(2)))); EXPECT_EQ(Maybe(), (Choice(Maybe(false), Maybe(1), Maybe()))); EXPECT_EQ( Maybe(2), (Choice(Maybe(false), Maybe(1), Maybe(2)))); EXPECT_EQ(Maybe(2), (Choice(Maybe(false), Maybe(-1), Maybe(2)))); EXPECT_EQ(Maybe(-1), (Choice(Maybe(true), Maybe(-1), Maybe(2)))); EXPECT_EQ(Maybe(true), (Choice( Maybe(false), Maybe(false), Maybe(true)))); } TEST(Maximum, Maximum) { EXPECT_EQ(Maybe(100), (Maximum(Maybe(100)))); EXPECT_EQ(Maybe(99), (Maximum(Maybe(99), Maybe(50)))); EXPECT_EQ(Maybe(98), (Maximum(Maybe(50), Maybe(98)))); EXPECT_EQ(Maybe(97), (Maximum(Maybe(50), Maybe(70), Maybe(97)))); EXPECT_EQ(Maybe(), (Maximum( Maybe(50), Maybe(), Maybe(97)))); EXPECT_EQ(Maybe(-100), (Maximum( Maybe(-120), Maybe(-150), Maybe(-100)))); EXPECT_EQ(Maybe(), (Maximum(Maybe()))); } } // namespace test } // namespace support } // namespace emboss