Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FacilitiesTest.h 7.51 KiB
#ifndef MANTID_FACILITIESTEST_H_
#define MANTID_FACILITIESTEST_H_

#include <cxxtest/TestSuite.h>
#include <fstream>
#include <string>

#include "MantidKernel/FacilityInfo.h"
#include "MantidKernel/ConfigService.h"
#include "MantidKernel/Exception.h"

#include <Poco/DOM/DOMParser.h>
#include <Poco/DOM/Document.h>
#include <Poco/DOM/Element.h>
#include <Poco/DOM/NodeList.h>

using namespace Mantid::Kernel;

class FacilitiesTest : public CxxTest::TestSuite {
public:
  void test_throws_on_missing_facility_name() {
    const std::string xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                               "<facilities>"
                               "  <facility zeropadding=\"5\" "
                               "FileExtensions=\".nxs,.raw,.sav,.n*,.s*\">"
                               "  </facility>"
                               "</facilities>";

    TS_ASSERT_THROWS(getFacility(xmlStr), std::runtime_error);
  }

  void test_throws_if_no_file_extensions() {
    const std::string xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                               "<facilities>"
                               "  <facility name=\"MyFacility\">"
                               "  </facility>"
                               "</facilities>";

    TS_ASSERT_THROWS(getFacility(xmlStr), std::runtime_error);
  }

  void test_throws_if_no_instruments() {
    const std::string xmlStr =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<facilities>"
        "  <facility name=\"MyFacility\" FileExtensions=\".xyz\">"
        "  </facility>"
        "</facilities>";

    TS_ASSERT_THROWS(getFacility(xmlStr), std::runtime_error);
  }

  void test_minimal() {
    const std::string xmlStr =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<facilities>"
        "  <facility name=\"MyFacility\" FileExtensions=\".xyz\">"
        "    <instrument name=\"AnInst\">"
        "      <technique>Measuring Stuff</technique>"
        "    </instrument>"
        "  </facility>"
        "</facilities>";

    FacilityInfo *fac = nullptr;
    TS_ASSERT_THROWS_NOTHING(fac = getFacility(xmlStr));

    // Check that the few required things are set and that everything else has
    // its default value
    TS_ASSERT_EQUALS(fac->name(), "MyFacility");
    TS_ASSERT_EQUALS(fac->zeroPadding(), 0);
    TS_ASSERT(fac->delimiter().empty())
    const std::vector<std::string> exts = fac->extensions();
    TS_ASSERT_EQUALS(fac->extensions().size(), 1);
    TS_ASSERT_EQUALS(fac->extensions()[0], ".xyz");
    TS_ASSERT_EQUALS(fac->preferredExtension(), ".xyz");
    TS_ASSERT(fac->archiveSearch().empty());
    TS_ASSERT_EQUALS(fac->instruments().size(), 1);
    TS_ASSERT_EQUALS(fac->instruments().front().name(), "AnInst");
    TS_ASSERT_EQUALS(fac->instruments("Measuring Stuff").front().name(),
                     "AnInst");
    TS_ASSERT(fac->instruments("Nonsense").empty());
    TS_ASSERT_EQUALS(fac->instrument("AnInst").name(), "AnInst");
    TS_ASSERT_THROWS(fac->instrument("NoInst"), Exception::NotFoundError);

    delete fac;
  }

  void testFacilities() {
    const std::string xmlStr =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<facilities>"
        "  <facility name=\"ISIS\" zeropadding=\"5\" delimiter=\"%\" "
        "FileExtensions=\".nxs,.raw,.sav,.n*,.s*\">"
        "    <archive>"
        "      <archiveSearch plugin=\"ADataSearch\" />"
        "      <archiveSearch plugin=\"BDataSearch\" />"
        "    </archive>"
        "    <instrument name=\"HRPD\" shortname=\"HRP\">"
        "      <technique>Powder Diffraction</technique>"
        "    </instrument>"
        "    <instrument name=\"WISH\" >"
        "      <zeropadding size=\"8\"/>"
        "      <zeropadding size=\"15\" startRunNumber=\"300\"/>"
        "      <technique>Powder Diffraction</technique>"
        "      <technique>Single Crystal Diffraction</technique>"
        "    </instrument>"
        "  </facility>"
        "</facilities>";

    FacilityInfo *fac = getFacility(xmlStr);

    TS_ASSERT(fac);

    TS_ASSERT_EQUALS(fac->name(), "ISIS");
    TS_ASSERT_EQUALS(fac->zeroPadding(), 5);
    TS_ASSERT_EQUALS(fac->delimiter(), "%");
    const std::vector<std::string> exts = fac->extensions();
    TS_ASSERT_EQUALS(exts.size(), 5);
    TS_ASSERT_EQUALS(exts[0], ".nxs");
    TS_ASSERT_EQUALS(exts[1], ".raw");
    TS_ASSERT_EQUALS(exts[2], ".sav");
    TS_ASSERT_EQUALS(exts[3], ".n*");
    TS_ASSERT_EQUALS(exts[4], ".s*");
    TS_ASSERT_EQUALS(fac->preferredExtension(), ".nxs");

    TS_ASSERT_EQUALS(fac->archiveSearch().size(), 2);
    std::vector<std::string>::const_iterator it = fac->archiveSearch().begin();
    TS_ASSERT_EQUALS(*it, "ADataSearch");
    TS_ASSERT_EQUALS(*++it, "BDataSearch");

    const std::vector<InstrumentInfo> instrums = fac->instruments();
    TS_ASSERT_EQUALS(instrums.size(), 2);

    TS_ASSERT_THROWS_NOTHING(fac->instrument("HRPD"));
    InstrumentInfo instr =
        fac->instrument("HRP"); // Tests getting by short name
    TS_ASSERT_EQUALS(instr.name(), "HRPD");
    TS_ASSERT_EQUALS(instr.shortName(), "HRP");
    TS_ASSERT_EQUALS(instr.zeroPadding(123), 5);
    TS_ASSERT_THROWS_NOTHING(fac->instrument("WISH"));
    instr = fac->instrument("WISH");
    TS_ASSERT_EQUALS(instr.name(), "WISH");
    TS_ASSERT_EQUALS(instr.shortName(), "WISH");
    TS_ASSERT_EQUALS(instr.zeroPadding(123), 8);
    TS_ASSERT_EQUALS(instr.zeroPadding(301), 15);

    const std::vector<InstrumentInfo> pwdInstr =
        fac->instruments("Powder Diffraction");
    TS_ASSERT_EQUALS(pwdInstr.size(), 2);

    const std::vector<InstrumentInfo> crysInstr =
        fac->instruments("Single Crystal Diffraction");
    TS_ASSERT_EQUALS(crysInstr.size(), 1);
    TS_ASSERT_EQUALS(fac->instruments("rubbish category").size(), 0);

    delete fac;
  }

  void testConfigService() {
    TS_ASSERT_THROWS_NOTHING(ConfigService::Instance().getFacility("ISIS"));
  }

  void testDefaultInstrument() {
    ConfigService::Instance().setString("default.instrument", "HRPD");
    InstrumentInfo instr = ConfigService::Instance().getInstrument();
    TS_ASSERT_EQUALS(instr.name(), "HRPD");
  }

  void testFacilitiesArchiveMissing() {
    const std::string xmlStr =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<facilities>"
        "  <facility name=\"ISIS\" zeropadding=\"5\" "
        "FileExtensions=\".nxs,.raw,.sav,.n*,.s*\">"
        "    <instrument name=\"HRPD\" shortname=\"HRP\">"
        "      <technique>Powder Diffraction</technique>"
        "    </instrument>"
        "    <instrument name=\"WISH\" zeropadding=\"8\">"
        "      <technique>Powder Diffraction</technique>"
        "      <technique>Single Crystal Diffraction</technique>"
        "    </instrument>"
        "  </facility>"
        "</facilities>";

    FacilityInfo *fac = getFacility(xmlStr);

    TS_ASSERT(fac);

    TS_ASSERT_EQUALS(fac->name(), "ISIS");
    TS_ASSERT_EQUALS(fac->archiveSearch().size(), 0);

    delete fac;
  }

private:
  FacilityInfo *getFacility(const std::string &xmlStr) const {
    Poco::XML::DOMParser parser;
    Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parseString(xmlStr);
    TS_ASSERT(pDoc);

    Poco::XML::Element *pRootElem = pDoc->documentElement();
    Poco::AutoPtr<Poco::XML::NodeList> pNL_facility =
        pRootElem->getElementsByTagName("facility");
    size_t n = pNL_facility->length();

    TS_ASSERT(n > 0);

    Poco::XML::Element *elem =
        dynamic_cast<Poco::XML::Element *>(pNL_facility->item(0));
    TS_ASSERT(elem);

    FacilityInfo *facility = new FacilityInfo(elem);

    return facility;
  }
};

#endif /*MANTID_FACILITIESTEST_H_*/