Skip to content

Commit

Permalink
lib: improvements to QualifiedResourceNameTypeConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
franku committed Sep 7, 2018
1 parent d8544b9 commit 08e8350
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 71 deletions.
65 changes: 24 additions & 41 deletions core/src/lib/qualified_resource_name_type_converter.cc
Expand Up @@ -30,70 +30,56 @@ std::map<T2, T1> swapPairs(std::map<T1, T2> m)
{
std::map<T2, T1> m1;

for (auto &&item : m) {
m1.emplace(item.second, item.first);
}
for (auto &&item : m) { m1.emplace(item.second, item.first); }

return m1;
};

QualifiedResourceNameTypeConverter::QualifiedResourceNameTypeConverter(std::map<int, std::string> map)
QualifiedResourceNameTypeConverter::QualifiedResourceNameTypeConverter(const std::map<int, std::string> &map)
: type_name_relation_map_(map), name_type_relation_map_(swapPairs(map))
{
type_name_relation_map_ = map;
name_type_relation_map_ = swapPairs(map);
return;
}

std::string QualifiedResourceNameTypeConverter::ResourceTypeToString(const int &r_type) const
{
if (type_name_relation_map_.empty()) {
return std::string();
}
if (type_name_relation_map_.find(r_type) == type_name_relation_map_.end()) {
return std::string();
}
if (type_name_relation_map_.empty()) { return std::string(); }
if (type_name_relation_map_.find(r_type) == type_name_relation_map_.end()) { return std::string(); }
return type_name_relation_map_.at(r_type);
}

int QualifiedResourceNameTypeConverter::StringToResourceType(const std::string &r_name) const
{
if (name_type_relation_map_.empty()) {
return -1;
}
if (name_type_relation_map_.find(r_name) == name_type_relation_map_.end()) {
return -1;
}
if (name_type_relation_map_.empty()) { return -1; }
if (name_type_relation_map_.find(r_name) == name_type_relation_map_.end()) { return -1; }
return name_type_relation_map_.at(r_name);
}

bool QualifiedResourceNameTypeConverter::ResourceToString(const std::string &name_of_resource,
const int &r_type,
std::string &out) const
std::string &str_out) const
{
std::string r_name = ResourceTypeToString(r_type);
if (r_name.empty()) {
return false;
}
out = r_name + std::string(":") + name_of_resource;
if (r_name.empty()) { return false; }
str_out = r_name + std::string(":") + name_of_resource;
return true;
}

bool QualifiedResourceNameTypeConverter::ResourceToString(const std::string &name_of_resource,
const int &r_type,
const int &job_id,
std::string &out) const
std::string &str_out) const
{
std::string r_name = ResourceTypeToString(r_type);
if (r_name.empty()) {
return false;
}
out = r_name + std::string(":") + name_of_resource + std::string(":") + std::to_string(job_id);
if (r_name.empty()) { return false; }
str_out = r_name + std::string(":") + name_of_resource + std::string(":") + std::to_string(job_id);
return true;
}

template <class Container>
void split(const std::string &str, Container &cont, char delim, int max_substring)
static void SplitStringIntoList(const std::string &str_in, Container &cont, char delim, int max_substring)
{
std::stringstream ss(str);
std::stringstream ss(str_in);
std::string token;
int max = max_substring;
while (std::getline(ss, token, delim) && max) {
Expand All @@ -105,28 +91,25 @@ void split(const std::string &str, Container &cont, char delim, int max_substrin
bool QualifiedResourceNameTypeConverter::StringToResource(std::string &name_of_resource,
int &r_type,
int &job_id,
const std::string &in) const
const std::string &str_in) const
{
std::vector<std::string> string_list;
split(in, string_list, ':', 3);
if (string_list.size() < 2) { /* minimum of parameters are name and r_type */
SplitStringIntoList(str_in, string_list, ':', 3);
if (string_list.size() < 2) { /* minimum of parameters are name_of_resource and r_type */
return false;
}
std::string r_type_str = string_list.at(0);
int r_type_eval = StringToResourceType(r_type_str);
if (r_type_eval == -1) {
return false;
}
r_type = r_type_eval;
int r_type_temp = StringToResourceType(r_type_str);
if (r_type_temp == -1) { return false; }
r_type = r_type_temp;
name_of_resource = string_list.at(1);

if (string_list.size() == 3) {
if (string_list.size() == 3) { /* str_in contains probably a job_id */
int job_id_temp;
std::string job_id_str = string_list.at(2);
try {
job_id_temp = std::stoi(job_id_str);
}
catch (const std::exception &e) {
} catch (const std::exception &e) {
return false;
}
job_id = job_id_temp;
Expand Down
11 changes: 7 additions & 4 deletions core/src/lib/qualified_resource_name_type_converter.h
Expand Up @@ -26,14 +26,17 @@

class QualifiedResourceNameTypeConverter {
public:
QualifiedResourceNameTypeConverter(std::map<int, std::string> map);
QualifiedResourceNameTypeConverter(const std::map<int, std::string> &map);
bool ResourceToString(const std::string &name_of_resource, const int &r_type, std::string &out) const;
bool ResourceToString(const std::string &name_of_resource, const int &r_type, const int &JobId, std::string &out) const;
bool ResourceToString(const std::string &name_of_resource,
const int &r_type,
const int &JobId,
std::string &out) const;
bool StringToResource(std::string &name_of_resource, int &r_type, int &job_id, const std::string &in) const;

private:
std::map<int, std::string> type_name_relation_map_;
std::map<std::string, int> name_type_relation_map_;
const std::map<int, std::string> type_name_relation_map_;
const std::map<std::string, int> name_type_relation_map_;

std::string ResourceTypeToString(const int &type) const;
int StringToResourceType(const std::string &) const;
Expand Down
Expand Up @@ -19,7 +19,6 @@
02110-1301, USA.
*/


#include "gtest/gtest.h"
#define private public
#include "lib/qualified_resource_name_type_converter.h"
Expand All @@ -34,51 +33,76 @@ enum
kNotInsertedIntoMap = 4
};

static std::map<int, std::string> create_test_map()
static const std::map<int, std::string> create_test_map()
{
std::map<int, std::string> map;
map.insert(std::make_pair(kOne, "kOne"));
map.insert(std::make_pair(kTwo, "kTwo"));
map.insert(std::make_pair(kThree, "kThree"));
const std::map<int, std::string> map{{kOne, "kOne"}, {kTwo, "kTwo"}, {kThree, "kThree"}};
return map;
}

TEST(QualifiedResourceNameTypeConverter, ResourceTypeToString)
TEST(QualifiedResourceNameTypeConverter, StringToType)
{
QualifiedResourceNameTypeConverter c(create_test_map());
bool ok;
int job_id;
int r_type;
std::string name;
std::string result_str;

EXPECT_STREQ(c.ResourceTypeToString(kOne).c_str(), "kOne");
EXPECT_STREQ(c.ResourceTypeToString(kTwo).c_str(), "kTwo");
EXPECT_STREQ(c.ResourceTypeToString(kThree).c_str(), "kThree");
EXPECT_STREQ(c.ResourceTypeToString(kNotInsertedIntoMap).c_str(), "");
QualifiedResourceNameTypeConverter c(create_test_map());

EXPECT_EQ(c.StringToResourceType("kOne"), kOne);
EXPECT_EQ(c.StringToResourceType("kTwo"), kTwo);
EXPECT_EQ(c.StringToResourceType("kThree"), kThree);
EXPECT_EQ(c.StringToResourceType("kNotInsertedIntoMap"), -1);

std::string result_str;
bool ok = c.ResourceToString("ResourceName", kTwo, result_str);
job_id = -1; /* job_id should be unchanged */
ok = c.StringToResource(name, r_type, job_id, "kOne:Developer");
EXPECT_EQ(ok, true);
EXPECT_STREQ(result_str.c_str(), "kTwo:ResourceName");

ok = c.ResourceToString("ResourceName", kNotInsertedIntoMap, result_str);
EXPECT_EQ(ok, false);
EXPECT_EQ(job_id, -1);

std::string name;
int r_type;
int job_id = -1;
ok = c.StringToResource(name, r_type, job_id, "kOne:Developer:123");
job_id = -1; /* job_id should will be changed */
ok = c.StringToResource(name, r_type, job_id, "kOne:Developer:123");
EXPECT_EQ(ok, true);
EXPECT_EQ(r_type, kOne);
EXPECT_EQ(job_id, 123);
EXPECT_STREQ(name.c_str(), "Developer");

ok = c.StringToResource(name, r_type, job_id, "kOneDeveloper");
/* try invalid string */
ok = c.StringToResource(name, r_type, job_id, "foobar");
EXPECT_EQ(ok, false);

job_id = -1;
ok = c.StringToResource(name, r_type, job_id, "kOne:Developer");
/* try invalid job_id (not a number) */
job_id = -2; /* job_id should be unchanged */
ok = c.StringToResource(name, r_type, job_id, "kOne:Developer:foo");
EXPECT_EQ(ok, false);
EXPECT_EQ(job_id, -2);
}

TEST(QualifiedResourceNameTypeConverter, TypeToString)
{
bool ok;
int job_id = 0;
std::string name;
std::string result_str;

QualifiedResourceNameTypeConverter c(create_test_map());

EXPECT_STREQ(c.ResourceTypeToString(kOne).c_str(), "kOne");
EXPECT_STREQ(c.ResourceTypeToString(kTwo).c_str(), "kTwo");
EXPECT_STREQ(c.ResourceTypeToString(kThree).c_str(), "kThree");
EXPECT_STREQ(c.ResourceTypeToString(kNotInsertedIntoMap).c_str(), "");

/* resource without job_id */
ok = c.ResourceToString("ResourceName", kTwo, result_str);
EXPECT_EQ(ok, true);
EXPECT_EQ(job_id, -1);
EXPECT_STREQ(result_str.c_str(), "kTwo:ResourceName");

/* resource with job_id */
job_id = 456;
ok = c.ResourceToString("ResourceName2", kTwo, job_id, result_str);
EXPECT_EQ(ok, true);
EXPECT_STREQ(result_str.c_str(), "kTwo:ResourceName2:456");

/* try invalid resource type */
ok = c.ResourceToString("ResourceName", kNotInsertedIntoMap, result_str);
EXPECT_EQ(ok, false);
}

0 comments on commit 08e8350

Please sign in to comment.