| 2244 | |
| 2245 | template <typename TYPE> |
| 2246 | void CheckFloatingNanEquality() { |
| 2247 | using V = NumericArgType<TYPE>; |
| 2248 | std::shared_ptr<Array> a, b; |
| 2249 | std::shared_ptr<DataType> type = TypeTraits<TYPE>::type_singleton(); |
| 2250 | |
| 2251 | const auto nan_value = std::numeric_limits<V>::quiet_NaN(); |
| 2252 | |
| 2253 | // NaN in a null entry |
| 2254 | ArrayFromVector<TYPE, V>(type, {true, false}, {V(0.5), nan_value}, &a); |
| 2255 | ArrayFromVector<TYPE, V>(type, {true, false}, {V(0.5), nan_value}, &b); |
| 2256 | ASSERT_TRUE(a->Equals(b)); |
| 2257 | ASSERT_TRUE(b->Equals(a)); |
| 2258 | ASSERT_TRUE(a->ApproxEquals(b)); |
| 2259 | ASSERT_TRUE(b->ApproxEquals(a)); |
| 2260 | ASSERT_TRUE(a->RangeEquals(b, 0, 2, 0)); |
| 2261 | ASSERT_TRUE(b->RangeEquals(a, 0, 2, 0)); |
| 2262 | ASSERT_TRUE(a->RangeEquals(b, 1, 2, 1)); |
| 2263 | ASSERT_TRUE(b->RangeEquals(a, 1, 2, 1)); |
| 2264 | |
| 2265 | // NaN in a valid entry |
| 2266 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), nan_value}, &a); |
| 2267 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), nan_value}, &b); |
| 2268 | ASSERT_FALSE(a->Equals(b)); |
| 2269 | ASSERT_FALSE(b->Equals(a)); |
| 2270 | ASSERT_TRUE(a->Equals(b, EqualOptions().nans_equal(true))); |
| 2271 | ASSERT_TRUE(b->Equals(a, EqualOptions().nans_equal(true))); |
| 2272 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2273 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2274 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(true))); |
| 2275 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(true))); |
| 2276 | // NaN in tested range |
| 2277 | ASSERT_FALSE(a->RangeEquals(b, 0, 2, 0)); |
| 2278 | ASSERT_FALSE(b->RangeEquals(a, 0, 2, 0)); |
| 2279 | ASSERT_FALSE(a->RangeEquals(b, 1, 2, 1)); |
| 2280 | ASSERT_FALSE(b->RangeEquals(a, 1, 2, 1)); |
| 2281 | // NaN not in tested range |
| 2282 | ASSERT_TRUE(a->RangeEquals(b, 0, 1, 0)); |
| 2283 | ASSERT_TRUE(b->RangeEquals(a, 0, 1, 0)); |
| 2284 | |
| 2285 | // NaN != non-NaN |
| 2286 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), nan_value}, &a); |
| 2287 | ArrayFromVector<TYPE, V>(type, {false, true}, {V(0.5), V(0.0)}, &b); |
| 2288 | ASSERT_FALSE(a->Equals(b)); |
| 2289 | ASSERT_FALSE(b->Equals(a)); |
| 2290 | ASSERT_FALSE(a->Equals(b, EqualOptions().nans_equal(true))); |
| 2291 | ASSERT_FALSE(b->Equals(a, EqualOptions().nans_equal(true))); |
| 2292 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2293 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2294 | ASSERT_FALSE(a->ApproxEquals(b, EqualOptions().atol(1e-5).nans_equal(true))); |
| 2295 | ASSERT_FALSE(b->ApproxEquals(a, EqualOptions().atol(1e-5).nans_equal(true))); |
| 2296 | // NaN in tested range |
| 2297 | ASSERT_FALSE(a->RangeEquals(b, 0, 2, 0)); |
| 2298 | ASSERT_FALSE(b->RangeEquals(a, 0, 2, 0)); |
| 2299 | ASSERT_FALSE(a->RangeEquals(b, 1, 2, 1)); |
| 2300 | ASSERT_FALSE(b->RangeEquals(a, 1, 2, 1)); |
| 2301 | // NaN not in tested range |
| 2302 | ASSERT_TRUE(a->RangeEquals(b, 0, 1, 0)); |
| 2303 | ASSERT_TRUE(b->RangeEquals(a, 0, 1, 0)); |
nothing calls this directly
no test coverage detected