blob: 6c41fc9102f2c7f429a876884af0183a7ea48b79 [file] [edit]
/*
* 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);
}
}