| 2305 | |
| 2306 | template <typename TYPE> |
| 2307 | void CheckFloatingInfinityEquality() { |
| 2308 | using V = NumericArgType<TYPE>; |
| 2309 | std::shared_ptr<Array> a, b; |
| 2310 | std::shared_ptr<DataType> type = TypeTraits<TYPE>::type_singleton(); |
| 2311 | |
| 2312 | const auto infinity = std::numeric_limits<V>::infinity(); |
| 2313 | |
| 2314 | for (auto nans_equal : {false, true}) { |
| 2315 | // Infinity in a null entry |
| 2316 | ArrayFromVector<TYPE, V>(type, {true, false}, {V(0.5), infinity}, &a); |
| 2317 | ArrayFromVector<TYPE, V>(type, {true, false}, {V(0.5), -infinity}, &b); |
| 2318 | ASSERT_TRUE(a->Equals(b)); |
| 2319 | ASSERT_TRUE(b->Equals(a)); |
| 2320 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2321 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2322 | ASSERT_TRUE(a->RangeEquals(b, 0, 2, 0)); |
| 2323 | ASSERT_TRUE(b->RangeEquals(a, 0, 2, 0)); |
| 2324 | ASSERT_TRUE(a->RangeEquals(b, 1, 2, 1)); |
| 2325 | ASSERT_TRUE(b->RangeEquals(a, 1, 2, 1)); |
| 2326 | |
| 2327 | // Infinity in a valid entry |
| 2328 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), infinity}, &a); |
| 2329 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), infinity}, &b); |
| 2330 | ASSERT_TRUE(a->Equals(b)); |
| 2331 | ASSERT_TRUE(b->Equals(a)); |
| 2332 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2333 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2334 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2335 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2336 | // Infinity in tested range |
| 2337 | ASSERT_TRUE(a->RangeEquals(b, 0, 2, 0)); |
| 2338 | ASSERT_TRUE(b->RangeEquals(a, 0, 2, 0)); |
| 2339 | ASSERT_TRUE(a->RangeEquals(b, 1, 2, 1)); |
| 2340 | ASSERT_TRUE(b->RangeEquals(a, 1, 2, 1)); |
| 2341 | // Infinity not in tested range |
| 2342 | ASSERT_TRUE(a->RangeEquals(b, 0, 1, 0)); |
| 2343 | ASSERT_TRUE(b->RangeEquals(a, 0, 1, 0)); |
| 2344 | |
| 2345 | // Infinity != non-infinity |
| 2346 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), -infinity}, &a); |
| 2347 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), V(0.0)}, &b); |
| 2348 | ASSERT_FALSE(a->Equals(b)); |
| 2349 | ASSERT_FALSE(b->Equals(a)); |
| 2350 | ASSERT_FALSE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2351 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2352 | ASSERT_FALSE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2353 | ASSERT_FALSE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2354 | // Infinity != Negative infinity |
| 2355 | ArrayFromVector<TYPE, V>(type, {true, true}, {V(0.5), -infinity}, &a); |
| 2356 | ArrayFromVector<TYPE, V>(type, {true, true}, {V(0.5), infinity}, &b); |
| 2357 | ASSERT_FALSE(a->Equals(b)); |
| 2358 | ASSERT_FALSE(b->Equals(a)); |
| 2359 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2360 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2361 | ASSERT_FALSE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2362 | ASSERT_FALSE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(nans_equal))); |
| 2363 | // Infinity in tested range |
| 2364 | ASSERT_FALSE(a->RangeEquals(b, 0, 2, 0)); |
nothing calls this directly
no test coverage detected