#include "dcp_assert.h"
#include "exceptions.h"
#include "language_tag.h"
+#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>
#include <string>
}
+LanguageTag::LanguageTag (string tag)
+{
+ vector<string> parts;
+ boost::split (parts, tag, boost::is_any_of("-"));
+ if (parts.empty()) {
+ throw LanguageTagError (String::compose("Could not parse language tag %1", tag));
+ }
+
+ vector<string>::size_type p = 0;
+ _language = LanguageSubtag (parts[p]);
+ ++p;
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ _script = ScriptSubtag (parts[p]);
+ ++p;
+ } catch (...) {}
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ _region = RegionSubtag (parts[p]);
+ ++p;
+ } catch (...) {}
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ while (true) {
+ _variants.push_back (VariantSubtag(parts[p]));
+ ++p;
+ if (p == parts.size()) {
+ return;
+ }
+ }
+ } catch (...) {}
+
+ try {
+ while (true) {
+ _extlangs.push_back (ExtlangSubtag(parts[p]));
+ ++p;
+ if (p == parts.size()) {
+ return;
+ }
+ }
+ } catch (...) {}
+
+ if (p < parts.size()) {
+ throw LanguageTagError (String::compose("Unrecognised subtag %1", parts[p]));
+ }
+}
+
+
string
LanguageTag::to_string () const
{
bool operator< (ExtlangSubtag const& other) const;
};
+ LanguageTag () {}
+ LanguageTag (std::string tag);
+
void set_language (LanguageSubtag language);
void set_script (ScriptSubtag script);
void set_region (RegionSubtag region);
using std::string;
-BOOST_AUTO_TEST_CASE (language_tag_test)
+BOOST_AUTO_TEST_CASE (language_tag_create_test)
{
/* Bad subtags raise errors */
}
}
+
+
+BOOST_AUTO_TEST_CASE (language_tag_parse_test)
+{
+ BOOST_CHECK_THROW (dcp::LanguageTag(""), dcp::LanguageTagError);
+ BOOST_CHECK_THROW (dcp::LanguageTag("...Aw498012351!"), dcp::LanguageTagError);
+ BOOST_CHECK_THROW (dcp::LanguageTag("fish"), dcp::LanguageTagError);
+ BOOST_CHECK_THROW (dcp::LanguageTag("de-Dogr-fish"), dcp::LanguageTagError);
+ BOOST_CHECK_THROW (dcp::LanguageTag("de-Dogr-DE-aranes-fish"), dcp::LanguageTagError);
+
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de").to_string(), "de");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr").to_string(), "de-Dogr");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr-DE").to_string(), "de-Dogr-DE");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr-DE-aranes").to_string(), "de-Dogr-DE-aranes");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr-DE-aranes-lemosin").to_string(), "de-Dogr-DE-aranes-lemosin");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr-DE-aranes-lemosin-abv").to_string(), "de-Dogr-DE-aranes-lemosin-abv");
+ BOOST_CHECK_EQUAL (dcp::LanguageTag("de-Dogr-DE-aranes-lemosin-abv-zsm").to_string(), "de-Dogr-DE-aranes-lemosin-abv-zsm");
+}
+