Cleanup: replace some list with vector.
[dcpomatic.git] / test / config_test.cc
index 0e6a05ac04e384e420ecbc2d900ba3415e989cda..103a6a58555ac0f181353afac8f6f257c14f495d 100644 (file)
 */
 
 
+#include "lib/cinema.h"
 #include "lib/config.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
 #include <fstream>
 
 
+using std::make_shared;
 using std::ofstream;
 using std::string;
+using std::vector;
 using boost::optional;
 
 
@@ -174,7 +177,7 @@ BOOST_AUTO_TEST_CASE (config_upgrade_test)
        boost::filesystem::copy_file ("test/data/2.14.cinemas.xml", dir / "cinemas.xml");
        Config::instance();
        try {
-               /* This will fail to write cinemas.xml since the link is to a non-existant directory */
+               /* This will fail to write cinemas.xml since the link is to a non-existent directory */
                Config::instance()->write();
        } catch (...) {}
 
@@ -190,3 +193,59 @@ BOOST_AUTO_TEST_CASE (config_upgrade_test)
        BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.16" / "cinemas.xml"));
 }
 
+
+BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config)
+{
+       ConfigRestorer cr;
+
+       boost::filesystem::path dir = "build/test/config_keep_cinemas_if_making_new_config";
+       Config::override_path = dir;
+       Config::drop ();
+       boost::filesystem::remove_all (dir);
+       boost::filesystem::create_directories (dir);
+
+       Config::instance()->write();
+
+       Config::instance()->add_cinema(make_shared<Cinema>("My Great Cinema", vector<string>(), "", 0, 0));
+       Config::instance()->write();
+
+       boost::filesystem::copy_file (dir / "cinemas.xml", dir / "backup_for_test.xml");
+
+       Config::drop ();
+       boost::filesystem::remove (dir / "2.16" / "config.xml");
+       Config::instance();
+
+       check_text_file(dir / "backup_for_test.xml", dir / "cinemas.xml");
+}
+
+
+BOOST_AUTO_TEST_CASE(keep_config_if_cinemas_fail_to_load)
+{
+       ConfigRestorer cr;
+
+       /* Make a new config */
+       boost::filesystem::path dir = "build/test/keep_config_if_cinemas_fail_to_load";
+       Config::override_path = dir;
+       Config::drop();
+       boost::filesystem::remove_all(dir);
+       boost::filesystem::create_directories(dir);
+       Config::instance()->write();
+
+       auto const cinemas = dir / "cinemas.xml";
+
+       /* Back things up */
+       boost::filesystem::copy_file(dir / "2.16" / "config.xml", dir / "config_backup_for_test.xml");
+       boost::filesystem::copy_file(cinemas, dir / "cinemas_backup_for_test.xml");
+
+       /* Corrupt the cinemas */
+       Config::drop();
+       std::ofstream corrupt(cinemas.string().c_str());
+       corrupt << "foo\n";
+       corrupt.close();
+       Config::instance();
+
+       /* We should have a new cinemas.xml and the old config.xml */
+       check_text_file(dir / "2.16" / "config.xml", dir / "config_backup_for_test.xml");
+       check_text_file(cinemas, dir / "cinemas_backup_for_test.xml");
+}
+