| /* | |
| * Copyright 2026 WebAssembly Community Group participants | |
| * | |
| * 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 "ir/abstract.h" | |
| #include "gtest/gtest.h" | |
| using namespace wasm; | |
| using namespace wasm::Abstract; | |
| TEST(AbstractTest, NegateRelational) { | |
| // Equality | |
| EXPECT_EQ(negateRelational(Eq), Ne); | |
| EXPECT_EQ(negateRelational(Ne), Eq); | |
| // Signed inequalities | |
| EXPECT_EQ(negateRelational(LtS), GeS); | |
| EXPECT_EQ(negateRelational(LeS), GtS); | |
| EXPECT_EQ(negateRelational(GtS), LeS); | |
| EXPECT_EQ(negateRelational(GeS), LtS); | |
| // Unsigned inequalities | |
| EXPECT_EQ(negateRelational(LtU), GeU); | |
| EXPECT_EQ(negateRelational(LeU), GtU); | |
| EXPECT_EQ(negateRelational(GtU), LeU); | |
| EXPECT_EQ(negateRelational(GeU), LtU); | |
| } | |
| TEST(AbstractTest, FlipRelational) { | |
| // Equality (symmetric: flipping sides does not change the operator) | |
| EXPECT_EQ(flipRelational(Eq), Eq); | |
| EXPECT_EQ(flipRelational(Ne), Ne); | |
| // Signed inequalities (antisymmetric: flipping sides reverses comparison) | |
| EXPECT_EQ(flipRelational(LtS), GtS); | |
| EXPECT_EQ(flipRelational(LeS), GeS); | |
| EXPECT_EQ(flipRelational(GtS), LtS); | |
| EXPECT_EQ(flipRelational(GeS), LeS); | |
| // Unsigned inequalities (antisymmetric: flipping sides reverses comparison) | |
| EXPECT_EQ(flipRelational(LtU), GtU); | |
| EXPECT_EQ(flipRelational(LeU), GeU); | |
| EXPECT_EQ(flipRelational(GtU), LtU); | |
| EXPECT_EQ(flipRelational(GeU), LeU); | |
| } | |
| TEST(AbstractTest, RelationalInvolutions) { | |
| const Op relationalOps[] = { | |
| Eq, | |
| Ne, | |
| LtS, | |
| LtU, | |
| LeS, | |
| LeU, | |
| GtS, | |
| GtU, | |
| GeS, | |
| GeU, | |
| }; | |
| for (auto op : relationalOps) { | |
| // Negating twice returns the original operator. | |
| EXPECT_EQ(negateRelational(negateRelational(op)), op); | |
| // Flipping twice returns the original operator. | |
| EXPECT_EQ(flipRelational(flipRelational(op)), op); | |
| } | |
| } | |
| TEST(AbstractTest, RelationalSymmetry) { | |
| const Op symmetricOps[] = {Eq, Ne}; | |
| for (auto op : symmetricOps) { | |
| EXPECT_TRUE(isRelationalSymmetric(op)); | |
| EXPECT_FALSE(isRelationalAntisymmetric(op)); | |
| // Symmetric operators are invariant under flipping. | |
| EXPECT_EQ(flipRelational(op), op); | |
| } | |
| const Op antisymmetricOps[] = {LtS, LtU, LeS, LeU, GtS, GtU, GeS, GeU}; | |
| for (auto op : antisymmetricOps) { | |
| EXPECT_FALSE(isRelationalSymmetric(op)); | |
| EXPECT_TRUE(isRelationalAntisymmetric(op)); | |
| // Antisymmetric operators are not invariant under flipping. | |
| EXPECT_NE(flipRelational(op), op); | |
| } | |
| } |