Skip to content

Commit

Permalink
cif tests
Browse files Browse the repository at this point in the history
  • Loading branch information
JarrettSJohnson committed Mar 31, 2024
1 parent 37d23cd commit 542fbd0
Showing 1 changed file with 151 additions and 151 deletions.
302 changes: 151 additions & 151 deletions layerCTest/Test_CifFile.cpp
Original file line number Diff line number Diff line change
@@ -1,151 +1,151 @@
#include "Test.h"

#include "CifFile.h"

using namespace pymol::test;

const char* SAMPLE_CIF_STR = R"""(
data_FOO
_cat1.key1 noquotes
_cat1.key2 "two words"
_cat1.key3 ? # unknown
_cat1.key4 . # inapplicable
_cat1.KEY5 "UPPER CASE key"
loop_
_cat2.key1
_cat2.key2
_cat2.key3
_cat2.key4
10 0.1 . foo
11 0.2 ? "TWO WORDS"
12 ? ?
;multi
line
value
; . 0.4 . .
data_bar
data_baz
_undotted_key "why not"
_typed_float1 1.23(45)e3
_typed_float2 1.234(5)e1
_typed_float3 1.23456789
)""";

TEST_CASE("misc", "[CifFile]")
{
// syntax 1
pymol::cif_file cf1(nullptr, SAMPLE_CIF_STR);
// syntax 2 (requires move constructor)
auto cf2 = pymol::cif_file(nullptr, SAMPLE_CIF_STR);
// move assign
pymol::cif_file cf3;
cf3 = pymol::cif_file(nullptr, SAMPLE_CIF_STR);

// check all three instances have same data
REQUIRE(cf1.datablocks().size() == 3);
REQUIRE(cf2.datablocks().size() == 3);
REQUIRE(cf3.datablocks().size() == 3);
REQUIRE(cf1.datablocks()[2].get_opt("_undotted_key")->as_s() == std::string("why not"));
REQUIRE(cf2.datablocks()[2].get_opt("_undotted_key")->as_s() == std::string("why not"));
REQUIRE(cf3.datablocks()[2].get_opt("_undotted_key")->as_s() == std::string("why not"));

auto& blocks = cf1.datablocks();

REQUIRE(blocks[0].code() == std::string("FOO"));
REQUIRE(blocks[1].code() == std::string("bar"));
REQUIRE(blocks[2].code() == std::string("baz"));

auto* data = &blocks.front();

REQUIRE(data->get_arr("_cat1.key3") != nullptr);
REQUIRE(data->get_arr("_cat1.key3") == data->get_opt("_cat1.key3"));
REQUIRE(data->get_arr("_cat1.key6") == nullptr);

REQUIRE(data->get_opt("_cat1.key1")->is_missing() == false);
REQUIRE(data->get_opt("_cat1.key2")->is_missing() == false);
REQUIRE(data->get_opt("_cat1.key3")->is_missing());
REQUIRE(data->get_opt("_cat1.key4")->is_missing());
REQUIRE(data->get_opt("_cat1.key5")->is_missing() == false);

REQUIRE(data->get_opt("_cat1.key4")->is_missing_all());
REQUIRE(data->get_opt("_cat1.key5")->is_missing_all() == false);

// looped data

REQUIRE(data->get_opt("_cat2.key1")->is_missing_all() == false);
REQUIRE(data->get_opt("_cat2.key3")->is_missing_all());

// template getters

std::vector<int> vec1{10, 11, 12, 0};
std::vector<float> vec2{0.1f, 0.2f, 99.f, 0.4f};

REQUIRE(data->get_opt("_cat2.key1")->to_vector<int>() == vec1);
REQUIRE(data->get_opt("_cat2.key2")->to_vector<float>(99.f) == vec2);

REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(0) == "foo");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(1) == "TWO WORDS");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(2) == "multi\nline\nvalue");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(3) == "");

REQUIRE(data->get_opt("_cat2.key4")->as<const char*>(0) == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->as<const char*>(3) == nullptr);

REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>()[0] == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>()[3] == nullptr);
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>("ABC")[0] == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>("ABC")[3] == std::string("ABC"));

// type deducted from default value

REQUIRE(data->get_opt("_cat2.key1")->as(0, 99) / 3 == 3); // int
REQUIRE(data->get_opt("_cat2.key1")->as(0, 99) / 3 != Approx(10. / 3.)); // int
REQUIRE(data->get_opt("_cat2.key1")->as(0, 99.) / 3 == Approx(10. / 3.)); // double
REQUIRE(data->get_opt("_cat2.key2")->as(0, 99.) == 0.1);
REQUIRE(data->get_opt("_cat2.key3")->as(0, 99.f) == 99.f);
REQUIRE(data->get_opt("_cat2.key4")->as(0, std::string("type deducted")) == "foo");
REQUIRE(data->get_opt("_cat2.key4")->as(3, std::string("type deducted")) == "type deducted");

// as_X getters

REQUIRE(data->get_opt("_cat2.key4")->as_s(0, "ABC") == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->as_s(3, "ABC") == std::string("ABC")); // missing

REQUIRE(data->get_opt("_cat2.key1")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_cat2.key1")->as_i(1, 99) == 11);
REQUIRE(data->get_opt("_cat2.key1")->as_i(3, 99) == 99); // missing

REQUIRE(data->get_opt("_cat2.key1")->as_d(0, 99.) == 10.);
REQUIRE(data->get_opt("_cat2.key1")->as_d(1, 99.) == 11.);
REQUIRE(data->get_opt("_cat2.key1")->as_d(3, 99.) == 99.); // missing

REQUIRE(data->get_opt("_cat2.key2")->as_d(0, 99.) == 0.1);
REQUIRE(data->get_opt("_cat2.key2")->as_d(2, 99.) == 99.f); // missing
REQUIRE(data->get_opt("_cat2.key2")->as_d(3, 99.) == 0.4);

// out of bounds is default

REQUIRE(data->get_opt("_cat2.key1")->as_i(50, 99) == 99);

// alternate names

REQUIRE(data->get_opt("_cat2.key1", "_other_name")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_other_name", "_cat2.key1")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_other_name", "_cat2_key1")->as_i(0, 99) == 99);

// wildcard lookup

REQUIRE(data->get_arr("_cat2_key1") == nullptr);
REQUIRE(data->get_opt("_cat2?key1")->as_i(0, 99) == 10);
REQUIRE(blocks[2].get_arr("_undotted.key") == nullptr);
REQUIRE(blocks[2].get_opt("_undotted?key")->as_s() == std::string("why not"));

// float parsing

REQUIRE(blocks[2].get_opt("_typed_float1")->as<float>() == Approx(1230.f));
REQUIRE(blocks[2].get_opt("_typed_float1")->as<double>() == Approx(1230.00000));
REQUIRE(blocks[2].get_opt("_typed_float2")->as<double>() == Approx(12.3400000));
REQUIRE(blocks[2].get_opt("_typed_float3")->as<double>() == Approx(1.23456789));
}

// vi:sw=2:expandtab
#include "Test.h"

#include "CifFile.h"

using namespace pymol::test;

const char* SAMPLE_CIF_STR = R"""(
data_FOO
_cat1.key1 noquotes
_cat1.key2 "two words"
_cat1.key3 ? # unknown
_cat1.key4 . # inapplicable
_cat1.KEY5 "UPPER CASE key"
loop_
_cat2.key1
_cat2.key2
_cat2.key3
_cat2.key4
10 0.1 . foo
11 0.2 ? "TWO WORDS"
12 ? ?
;multi
line
value
; . 0.4 . .
data_bar
data_baz
_undotted_key "why not"
_typed_float1 1.23(45)e3
_typed_float2 1.234(5)e1
_typed_float3 1.23456789
)""";

TEST_CASE("misc", "[CifFile]")
{
// syntax 1
pymol::cif_file cf1(nullptr, SAMPLE_CIF_STR);
// syntax 2 (requires move constructor)
auto cf2 = pymol::cif_file(nullptr, SAMPLE_CIF_STR);
// move assign
pymol::cif_file cf3;
cf3 = pymol::cif_file(nullptr, SAMPLE_CIF_STR);

// check all three instances have same data
REQUIRE(cf1.datablocks().size() == 3);
REQUIRE(cf2.datablocks().size() == 3);
REQUIRE(cf3.datablocks().size() == 3);
REQUIRE(cf1.datablocks().find("baz")->second.get_opt("_undotted_key")->as_s() == std::string("why not"));
REQUIRE(cf2.datablocks().find("baz")->second.get_opt("_undotted_key")->as_s() == std::string("why not"));
REQUIRE(cf3.datablocks().find("baz")->second.get_opt("_undotted_key")->as_s() == std::string("why not"));

auto& blocks = cf1.datablocks();

REQUIRE(blocks.find("FOO")->second.code() == std::string("FOO"));
REQUIRE(blocks.find("bar")->second.code() == std::string("bar"));
REQUIRE(blocks.find("baz")->second.code() == std::string("baz"));

auto* data = &blocks.find("FOO")->second;

REQUIRE(data->get_arr("_cat1.key3") != nullptr);
REQUIRE(data->get_arr("_cat1.key3") == data->get_opt("_cat1.key3"));
REQUIRE(data->get_arr("_cat1.key6") == nullptr);

REQUIRE(data->get_opt("_cat1.key1")->is_missing() == false);
REQUIRE(data->get_opt("_cat1.key2")->is_missing() == false);
REQUIRE(data->get_opt("_cat1.key3")->is_missing());
REQUIRE(data->get_opt("_cat1.key4")->is_missing());
REQUIRE(data->get_opt("_cat1.key5")->is_missing() == false);

REQUIRE(data->get_opt("_cat1.key4")->is_missing_all());
REQUIRE(data->get_opt("_cat1.key5")->is_missing_all() == false);

// looped data

REQUIRE(data->get_opt("_cat2.key1")->is_missing_all() == false);
REQUIRE(data->get_opt("_cat2.key3")->is_missing_all());

// template getters

std::vector<int> vec1{10, 11, 12, 0};
std::vector<float> vec2{0.1f, 0.2f, 99.f, 0.4f};

REQUIRE(data->get_opt("_cat2.key1")->to_vector<int>() == vec1);
REQUIRE(data->get_opt("_cat2.key2")->to_vector<float>(99.f) == vec2);

REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(0) == "foo");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(1) == "TWO WORDS");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(2) == "multi\nline\nvalue");
REQUIRE(data->get_opt("_cat2.key4")->as<std::string>(3) == "");

REQUIRE(data->get_opt("_cat2.key4")->as<const char*>(0) == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->as<const char*>(3) == nullptr);

REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>()[0] == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>()[3] == nullptr);
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>("ABC")[0] == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->to_vector<const char*>("ABC")[3] == std::string("ABC"));

// type deducted from default value

REQUIRE(data->get_opt("_cat2.key1")->as(0, 99) / 3 == 3); // int
REQUIRE(data->get_opt("_cat2.key1")->as(0, 99) / 3 != Approx(10. / 3.)); // int
REQUIRE(data->get_opt("_cat2.key1")->as(0, 99.) / 3 == Approx(10. / 3.)); // double
REQUIRE(data->get_opt("_cat2.key2")->as(0, 99.) == 0.1);
REQUIRE(data->get_opt("_cat2.key3")->as(0, 99.f) == 99.f);
REQUIRE(data->get_opt("_cat2.key4")->as(0, std::string("type deducted")) == "foo");
REQUIRE(data->get_opt("_cat2.key4")->as(3, std::string("type deducted")) == "type deducted");

// as_X getters

REQUIRE(data->get_opt("_cat2.key4")->as_s(0, "ABC") == std::string("foo"));
REQUIRE(data->get_opt("_cat2.key4")->as_s(3, "ABC") == std::string("ABC")); // missing

REQUIRE(data->get_opt("_cat2.key1")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_cat2.key1")->as_i(1, 99) == 11);
REQUIRE(data->get_opt("_cat2.key1")->as_i(3, 99) == 99); // missing

REQUIRE(data->get_opt("_cat2.key1")->as_d(0, 99.) == 10.);
REQUIRE(data->get_opt("_cat2.key1")->as_d(1, 99.) == 11.);
REQUIRE(data->get_opt("_cat2.key1")->as_d(3, 99.) == 99.); // missing

REQUIRE(data->get_opt("_cat2.key2")->as_d(0, 99.) == 0.1);
REQUIRE(data->get_opt("_cat2.key2")->as_d(2, 99.) == 99.f); // missing
REQUIRE(data->get_opt("_cat2.key2")->as_d(3, 99.) == 0.4);

// out of bounds is default

REQUIRE(data->get_opt("_cat2.key1")->as_i(50, 99) == 99);

// alternate names

REQUIRE(data->get_opt("_cat2.key1", "_other_name")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_other_name", "_cat2.key1")->as_i(0, 99) == 10);
REQUIRE(data->get_opt("_other_name", "_cat2_key1")->as_i(0, 99) == 99);

// wildcard lookup

REQUIRE(data->get_arr("_cat2_key1") == nullptr);
REQUIRE(data->get_opt("_cat2?key1")->as_i(0, 99) == 10);
REQUIRE(blocks.find("baz")->second.get_arr("_undotted.key") == nullptr);
REQUIRE(blocks.find("baz")->second.get_opt("_undotted?key")->as_s() == std::string("why not"));

// float parsing

REQUIRE(blocks.find("baz")->second.get_opt("_typed_float1")->as<float>() == Approx(1230.f));
REQUIRE(blocks.find("baz")->second.get_opt("_typed_float1")->as<double>() == Approx(1230.00000));
REQUIRE(blocks.find("baz")->second.get_opt("_typed_float2")->as<double>() == Approx(12.3400000));
REQUIRE(blocks.find("baz")->second.get_opt("_typed_float3")->as<double>() == Approx(1.23456789));
}

// vi:sw=2:expandtab

0 comments on commit 542fbd0

Please sign in to comment.