//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// This file contains the tests for the mlir::NonFloatComplex type. /// //===----------------------------------------------------------------------===// #include "mlir/Support/Complex.h" #include "gtest/gtest.h" namespace mlir { // Provide ostream operator so that tests pretty print NonFloatComplex values template static std::ostream &operator<<(std::ostream &os, const NonFloatComplex c) { os << "(" << c.real() << "," << c.imag() << ")"; return os; } } // namespace mlir // The majority of these tests just check that NonFloatComplex does exactly the // same as std::complex. TEST(ComplexTest, Typedef) { EXPECT_TRUE((std::is_same_v, std::complex>)); EXPECT_TRUE((std::is_same_v, mlir::NonFloatComplex>)); } TEST(ComplexTest, DefaultConstructor) { mlir::NonFloatComplex mc; std::complex sc; EXPECT_EQ(mc, sc); } TEST(ComplexTest, RealConstructor) { mlir::NonFloatComplex mc{10}; std::complex sc{10}; EXPECT_EQ(mc, sc); } TEST(ComplexTest, MemberConstructor) { mlir::NonFloatComplex mc{10, 20}; std::complex sc{10, 20}; EXPECT_EQ(mc, sc); } TEST(ComplexTest, ExplicitCopyConstructor) { std::complex sc{5, 10}; mlir::NonFloatComplex mc{sc}; EXPECT_EQ(mc, sc); // check the explicit constructors were used EXPECT_FALSE((std::is_convertible_v)); } TEST(ComplexTest, ImplicitCopyConstructor) { std::complex sc{}; mlir::NonFloatComplex mc = sc; EXPECT_EQ(mc, sc); // check the implicit constructors were used EXPECT_TRUE((std::is_convertible_v)); } TEST(ComplexTest, RealAccessor) { mlir::NonFloatComplex mc{5}; std::complex sc{5}; EXPECT_EQ(mc.real(), sc.real()); } TEST(ComplexTest, RealSetter) { mlir::NonFloatComplex mc{5}; mc.real(7); std::complex sc{5}; sc.real(7); EXPECT_EQ(mc.real(), sc.real()); } TEST(ComplexTest, ImagAccessor) { mlir::NonFloatComplex mc{2, 5}; std::complex sc{2, 5}; EXPECT_EQ(mc.imag(), sc.imag()); } TEST(ComplexTest, ImagSetter) { mlir::NonFloatComplex mc{2, 5}; mc.imag(8); std::complex sc{2, 5}; sc.imag(8); EXPECT_EQ(mc.imag(), sc.imag()); } TEST(ComplexTest, CopyAssignment) { mlir::NonFloatComplex mc{2, 5}; mlir::NonFloatComplex mc2 = mc; EXPECT_EQ(mc, mc2); } TEST(ComplexTest, StdCopyAssignment) { std::complex sc{2, 5}; mlir::NonFloatComplex mc = sc; EXPECT_EQ(mc, sc); } TEST(ComplexTest, RealAssignment) { std::complex sc = 2.f; mlir::NonFloatComplex mc = 2.f; EXPECT_EQ(mc, sc); } TEST(ComplexTest, PlusEqualsReal) { mlir::NonFloatComplex mc{2, 5}; mc += 7; std::complex sc{2, 5}; sc += 7; EXPECT_EQ(mc, sc); } TEST(ComplexTest, MinusEqualsReal) { mlir::NonFloatComplex mc{3, 6}; mc -= 8; std::complex sc{3, 6}; sc -= 8; EXPECT_EQ(mc, sc); } TEST(ComplexTest, TimesEqualsReal) { mlir::NonFloatComplex mc{1, 4}; mc *= 2; std::complex sc{1, 4}; sc *= 2; EXPECT_EQ(mc, sc); } TEST(ComplexTest, DivideEqualsReal) { mlir::NonFloatComplex mc{1, 4}; mc /= 2; std::complex sc{1, 4}; sc /= 2; EXPECT_EQ(mc, sc); } TEST(ComplexTest, AssignmentOp) { mlir::NonFloatComplex mc{2, 5}; mlir::NonFloatComplex mc2 = mc; EXPECT_EQ(mc, mc2); } TEST(ComplexTest, StdAssignmentOp) { std::complex sc{2, 5}; mlir::NonFloatComplex mc = sc; EXPECT_EQ(mc, sc); } TEST(ComplexTest, AddOp) { mlir::NonFloatComplex mc1{2, 5}; mlir::NonFloatComplex mc2{3, 7}; std::complex sc1{2, 5}; std::complex sc2{3, 7}; EXPECT_EQ(mc1 + mc2, sc1 + sc2); EXPECT_EQ(mc1 + 5.f, sc1 + 5.f); } TEST(ComplexTest, MinusOp) { mlir::NonFloatComplex mc1{2, 5}; mlir::NonFloatComplex mc2{3, 7}; std::complex sc1{2, 5}; std::complex sc2{3, 7}; EXPECT_EQ(mc1 - mc2, sc1 - sc2); EXPECT_EQ(mc1 - 5.f, sc1 - 5.f); } TEST(ComplexTest, TimesOp) { mlir::NonFloatComplex mc1{2, 5}; mlir::NonFloatComplex mc2{3, 7}; std::complex sc1{2, 5}; std::complex sc2{3, 7}; EXPECT_EQ(mc1 * mc2, sc1 * sc2); EXPECT_EQ(mc1 * 5.f, sc1 * 5.f); } TEST(ComplexTest, DivideOp) { mlir::NonFloatComplex mc1{5, 10}; mlir::NonFloatComplex mc2{3, 4}; std::complex sc1{5, 10}; std::complex sc2{3, 4}; EXPECT_EQ(mc1 / mc2, sc1 / sc2); EXPECT_EQ(mc1 / 5.f, sc1 / 5.f); } TEST(ComplexTest, EqualityOp) { mlir::NonFloatComplex mc1{3, 4}; mlir::NonFloatComplex mc2{3, 4}; EXPECT_EQ(mc1, mc2); EXPECT_EQ(mc2, mc1); } TEST(ComplexTest, StdEqualityOp) { mlir::NonFloatComplex mc{7, 8}; std::complex sc{7, 8}; EXPECT_EQ(mc, sc); EXPECT_EQ(sc, mc); } TEST(ComplexTest, InequalityOp) { mlir::NonFloatComplex mc1{3, 4}; mlir::NonFloatComplex mc2{7, 8}; EXPECT_NE(mc1, mc2); EXPECT_NE(mc2, mc1); } TEST(ComplexTest, StdInequalityOp) { mlir::NonFloatComplex mc{7, 8}; std::complex sc{3, 4}; EXPECT_NE(mc, sc); EXPECT_NE(sc, mc); } TEST(ComplexTest, RealFn) { mlir::NonFloatComplex mc{4, 6}; std::complex sc{4, 6}; EXPECT_EQ(real(mc), real(sc)); } TEST(ComplexTest, ImagFn) { mlir::NonFloatComplex mc{4, 6}; std::complex sc{4, 6}; EXPECT_EQ(imag(mc), imag(sc)); }