Skip to content

Commit 93765b0

Browse files
committed
Add ProjectUrl class
1 parent 7bedabd commit 93765b0

File tree

6 files changed

+150
-0
lines changed

6 files changed

+150
-0
lines changed

src/internal/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ target_sources(scratchcpp
66
reader_common.h
77
zipreader.cpp
88
zipreader.h
9+
projecturl.cpp
10+
projecturl.h
911
)

src/internal/projecturl.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
#include <vector>
4+
#include <sstream>
5+
#include <algorithm>
6+
7+
#include "projecturl.h"
8+
9+
using namespace libscratchcpp;
10+
11+
static const std::string PROJECT_SITE = "scratch.mit.edu";
12+
static const std::string PROJECT_SUBSITE = "projects";
13+
14+
ProjectUrl::ProjectUrl(const std::string &url)
15+
{
16+
std::vector<std::string> parts;
17+
std::istringstream stream(url);
18+
std::string str;
19+
20+
while (std::getline(stream, str, '/'))
21+
parts.push_back(str);
22+
23+
if (parts.empty())
24+
return;
25+
26+
// Remove empty parts
27+
parts.erase(std::remove(parts.begin(), parts.end(), ""), parts.end());
28+
29+
// Remove "http:" or "https:"
30+
while (!parts.empty() && ((parts.front() == "http:") || (parts.front() == "https:")))
31+
parts.erase(parts.begin());
32+
33+
// scratch.mit.edu/projects/(id)
34+
if (parts.size() != 3)
35+
return;
36+
37+
m_isProjectUrl = ((parts[0] == PROJECT_SITE) && (parts[1] == PROJECT_SUBSITE));
38+
m_projectId = parts[2];
39+
}
40+
41+
bool ProjectUrl::isProjectUrl() const
42+
{
43+
return m_isProjectUrl;
44+
}
45+
46+
const std::string &ProjectUrl::projectId() const
47+
{
48+
return m_projectId;
49+
}

src/internal/projecturl.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
#pragma once
4+
5+
#include <string>
6+
7+
namespace libscratchcpp
8+
{
9+
10+
class ProjectUrl
11+
{
12+
public:
13+
ProjectUrl(const std::string &url);
14+
15+
bool isProjectUrl() const;
16+
const std::string &projectId() const;
17+
18+
private:
19+
bool m_isProjectUrl = false;
20+
std::string m_projectId;
21+
};
22+
23+
} // namespace libscratchcpp

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@ add_subdirectory(timer)
3333
add_subdirectory(randomgenerator)
3434
add_subdirectory(imageformats)
3535
add_subdirectory(rect)
36+
add_subdirectory(network)

test/network/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# projecturl_test
2+
add_executable(
3+
projecturl_test
4+
projecturl_test.cpp
5+
)
6+
7+
target_link_libraries(
8+
projecturl_test
9+
GTest::gtest_main
10+
scratchcpp
11+
)
12+
13+
gtest_discover_tests(projecturl_test)

test/network/projecturl_test.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <internal/projecturl.h>
2+
3+
#include "../common.h"
4+
5+
using namespace libscratchcpp;
6+
7+
TEST(ProjectUrlTest, Parse)
8+
{
9+
{
10+
ProjectUrl url("");
11+
ASSERT_FALSE(url.isProjectUrl());
12+
ASSERT_TRUE(url.projectId().empty());
13+
}
14+
15+
{
16+
ProjectUrl url("scratch.mit.edu/projects/886166351");
17+
ASSERT_TRUE(url.isProjectUrl());
18+
ASSERT_EQ(url.projectId(), "886166351");
19+
}
20+
21+
{
22+
ProjectUrl url("/scratch.mit.edu/projects/886166351");
23+
ASSERT_TRUE(url.isProjectUrl());
24+
ASSERT_EQ(url.projectId(), "886166351");
25+
}
26+
27+
{
28+
ProjectUrl url("//scratch.mit.edu/projects/886166351/");
29+
ASSERT_TRUE(url.isProjectUrl());
30+
ASSERT_EQ(url.projectId(), "886166351");
31+
}
32+
33+
{
34+
ProjectUrl url("https://scratch.mit.edu/projects/886166351");
35+
ASSERT_TRUE(url.isProjectUrl());
36+
ASSERT_EQ(url.projectId(), "886166351");
37+
}
38+
39+
{
40+
ProjectUrl url("https:///http:/scratch.mit.edu//projects/886166351/");
41+
ASSERT_TRUE(url.isProjectUrl());
42+
ASSERT_EQ(url.projectId(), "886166351");
43+
}
44+
45+
{
46+
ProjectUrl url("http://scratch.mit.edu/projects/886166351");
47+
ASSERT_TRUE(url.isProjectUrl());
48+
ASSERT_EQ(url.projectId(), "886166351");
49+
}
50+
51+
{
52+
ProjectUrl url("https:/scratch.mit.edu/projects/886166351");
53+
ASSERT_TRUE(url.isProjectUrl());
54+
ASSERT_EQ(url.projectId(), "886166351");
55+
}
56+
57+
{
58+
ProjectUrl url("https://scratch.mit.edu/projects/test/886166351");
59+
ASSERT_FALSE(url.isProjectUrl());
60+
ASSERT_TRUE(url.projectId().empty());
61+
}
62+
}

0 commit comments

Comments
 (0)