// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "../image_analysis/scale_merge/HKLKey.h" TEST_CASE("HKLKey_NoSG_noMergeFriedel") { HKLKeyGenerator hkl_key_gen(false, 1); CHECK(hkl_key_gen(-1, -2, -3) != hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3)); } TEST_CASE("HKLKey_NoSG_MergeFriedel") { HKLKeyGenerator hkl_key_gen(true, 1); CHECK(hkl_key_gen(-1, -2, -3) == hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3)); } TEST_CASE("HKLKey_SG1_MergeFriedel") { HKLKeyGenerator hkl_key_gen(true, *gemmi::find_spacegroup_by_number(1)); CHECK(hkl_key_gen(-1, -2, -3) == hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3)); } TEST_CASE("HKLKey_SG1_NoMergeFriedel") { HKLKeyGenerator hkl_key_gen(false, *gemmi::find_spacegroup_by_number(1)); CHECK(hkl_key_gen(-1, -2, -3) != hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3)); } TEST_CASE("HKLKey_SG96_MergeFriedel") { HKLKeyGenerator hkl_key_gen(true, *gemmi::find_spacegroup_by_number(96)); CHECK(hkl_key_gen(-1, -2, -3) == hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-2,1,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-1,-2,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(2,-1,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(1,-2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-1,2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(2,1,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-2, -1, -3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-2,-1,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(2, 1, 3)); } TEST_CASE("HKLKey_SG96_NoMergeFriedel") { HKLKeyGenerator hkl_key_gen(false, *gemmi::find_spacegroup_by_number(96)); CHECK(hkl_key_gen(-1, -2, -3) != hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-2,1,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-1,-2,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(2,-1,3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(1,-2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-1,2,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(2,1,-3)); CHECK(hkl_key_gen(1,2,3) == hkl_key_gen(-2, -1, -3)); CHECK(hkl_key_gen(1,2,3) != hkl_key_gen(-2,-1,3)); CHECK(hkl_key_gen(1,2,3) != hkl_key_gen(2, 1, 3)); } TEST_CASE("HKLKey_pack_friedel") { HKLKeyGenerator hkl_key_gen(false, *gemmi::find_spacegroup_by_number(1)); CHECK(hkl_key_gen(-1, -2, -3).pack() != hkl_key_gen(1,2,3).pack()); CHECK(hkl_key_gen(-1,-2,-3).pack() == hkl_key_gen(-1,-2,-3).pack()); CHECK(hkl_key_gen(-1,-2,-3).pack() != hkl_key_gen(1,-2,-3).pack()); } TEST_CASE("HKLKey_pack_no_friedel") { HKLKeyGenerator hkl_key_gen(true, *gemmi::find_spacegroup_by_number(1)); CHECK(hkl_key_gen(-1, -2, -3).pack() == hkl_key_gen(1,2,3).pack()); CHECK(hkl_key_gen(-1,-2,-3).pack() == hkl_key_gen(-1,-2,-3).pack()); CHECK(hkl_key_gen(-1,-2,-3).pack() != hkl_key_gen(1,-2,-3).pack()); } TEST_CASE("HKLKey_sys_absence_P212121") { HKLKeyGenerator hkl_key_gen(false, *gemmi::find_spacegroup_by_number(19)); CHECK(hkl_key_gen.IsSystematicallyAbsent(5,0,0)); CHECK(!hkl_key_gen.IsSystematicallyAbsent(6,0,0)); CHECK(hkl_key_gen.IsSystematicallyAbsent(0,5,0)); CHECK(hkl_key_gen.IsSystematicallyAbsent(0,0,5)); CHECK(!hkl_key_gen.IsSystematicallyAbsent(0,4,0)); CHECK(!hkl_key_gen.IsSystematicallyAbsent(5,5,5)); } TEST_CASE("AcceptReflection_ResolutionLimits") { Reflection r{}; r.I = 100.0f; r.sigma = 5.0f; r.rlp = 1.0f; r.d = 20.0f; // No limits: only the finiteness checks apply. CHECK(AcceptReflection(r, std::nullopt, std::nullopt)); // Low-resolution limit rejects anything coarser than the limit, and is exclusive at it. CHECK_FALSE(AcceptReflection(r, std::nullopt, std::optional(15.0))); CHECK(AcceptReflection(r, std::nullopt, std::optional(20.0))); CHECK(AcceptReflection(r, std::nullopt, std::optional(50.0))); // High-resolution limit still rejects anything finer, in the same direction as before. CHECK_FALSE(AcceptReflection(r, std::optional(25.0), std::nullopt)); CHECK(AcceptReflection(r, std::optional(2.0), std::optional(50.0))); // The plain-double overload treats 0 as "no limit" at both ends. CHECK(AcceptReflection(r, 0.0, 0.0)); CHECK_FALSE(AcceptReflection(r, 0.0, 15.0)); CHECK(AcceptReflection(r, 2.0, 50.0)); }