1 /*
2  * Copyright (C) 1998-2018 ALPS Collaboration. See COPYRIGHT.TXT
3  * All rights reserved. Use is subject to license terms. See LICENSE.TXT
4  * For use in publications, see ACKNOWLEDGE.TXT
5  */
6 
7 /** @file params_hdf5.cpp
8 
9     @brief Tests saving/loading of parameters
10 */
11 
12 #include "./params_test_support.hpp"
13 
14 #include <iostream>
15 
16 using alps::params;
17 namespace ah5=alps::hdf5;
18 
19 namespace test_data {
20     static const char inifile_content[]=
21         "my_bool=true\n"
22         "my_int=1234\n"
23         "my_string=ABC\n"
24         "my_double=12.75\n"
25         ;
26 
27 }
28 
29 class ParamsTest : public ::testing::Test {
30   protected:
31     ParamsAndFile params_and_file_;
32     params& par_;
33     alps::testing::unique_file file_;
34   public:
ParamsTest()35     ParamsTest() : params_and_file_(::test_data::inifile_content),
36                    par_(*params_and_file_.get_params_ptr()),
37                    file_("params_hdf5_test.h5.", alps::testing::unique_file::REMOVE_AFTER/*KEEP_AFTER*/)
38 
39     {   }
40 };
41 
TEST_F(ParamsTest,saveLoad)42 TEST_F(ParamsTest, saveLoad) {
43     arg_holder args;
44     args.add("some=something");
45     params p_other(args.argc(), args.argv());
46     p_other["another_int"]=9999;
47 
48     par_.define<int>("my_int", "Integer param");
49     par_.define<double>("my_double", 0.00, "Double param");
50 
51     {
52         ah5::archive ar(file_.name(), "w");
53         ar["params"] << par_;
54     }
55 
56     {
57         ah5::archive ar(file_.name(), "r");
58         ar["params"] >> p_other;
59     }
60 
61     EXPECT_FALSE(p_other.exists("another_int"));
62     EXPECT_EQ(par_, p_other);
63 
64     EXPECT_TRUE(p_other.define<std::string>("my_string", "", "String param").ok());
65     EXPECT_EQ("ABC", p_other["my_string"].as<std::string>());
66 
67     EXPECT_FALSE(p_other.is_restored());
68     EXPECT_ANY_THROW(p_other.get_archive_name());
69 
70     EXPECT_EQ(par_.get_argv0(), p_other.get_argv0());
71     EXPECT_EQ(par_.get_ini_name_count(), p_other.get_ini_name_count());
72     for (int i=0; i<par_.get_ini_name_count(); ++i) {
73         EXPECT_EQ(par_.get_ini_name(i), p_other.get_ini_name(i));
74     }
75 }
76 
TEST_F(ParamsTest,h5Ctor)77 TEST_F(ParamsTest, h5Ctor) {
78     {
79         ah5::archive ar(file_.name(), "w");
80         ar["/parameters"] << par_;
81     }
82     arg_holder args;
83     args.add(file_.name());
84 
85     params p_new(args.argc(), args.argv());
86 
87     EXPECT_EQ(par_, p_new);
88 
89     EXPECT_FALSE(par_.is_restored());
90     EXPECT_ANY_THROW(par_.get_archive_name());
91 
92     EXPECT_TRUE(p_new.is_restored());
93     EXPECT_EQ(file_.name(), p_new.get_archive_name());
94 }
95 
TEST_F(ParamsTest,h5CtorExtraArgs)96 TEST_F(ParamsTest, h5CtorExtraArgs) {
97     {
98         ah5::archive ar(file_.name(), "w");
99         ar["/parameters"] << par_;
100     }
101     arg_holder args;
102     args.add(file_.name()).add("some=something");
103 
104     EXPECT_ANY_THROW(params p_new(args.argc(), args.argv()));
105 }
106 
TEST_F(ParamsTest,h5CtorNotFirstArgument)107 TEST_F(ParamsTest, h5CtorNotFirstArgument) {
108     {
109         ah5::archive ar(file_.name(), "w");
110         ar["/parameters"] << par_;
111     }
112     arg_holder args;
113     args.add("some=something").add(file_.name());
114 
115     EXPECT_ANY_THROW(params p_new(args.argc(), args.argv()));
116 }
117 
118