init: gtest and quiz 1.
This commit is contained in:
11
mixplus/CMakeLists.txt
Normal file
11
mixplus/CMakeLists.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||
|
||||
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
|
||||
|
||||
add_library(libmixplus STATIC ${SRC})
|
||||
|
||||
add_executable(mixplus main.cpp)
|
||||
|
||||
target_link_libraries(mixplus libmixplus)
|
||||
|
||||
add_subdirectory(tests)
|
30
mixplus/include/parser.h
Normal file
30
mixplus/include/parser.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
struct Result
|
||||
{
|
||||
std::string hexadecimal;
|
||||
|
||||
long digit;
|
||||
};
|
||||
|
||||
namespace mixplus
|
||||
{
|
||||
struct Parser
|
||||
{
|
||||
// 识别两个字符串并相加
|
||||
static long parseAndAdd(int argc, const char** argv);
|
||||
|
||||
// 格式化输出
|
||||
static Result formatResult(long value);
|
||||
|
||||
// 识别十进制或者十六进制输出
|
||||
static long parseNumber(const std::string& input);
|
||||
|
||||
// 识别十进制
|
||||
static long parseDigit(const std::string& input);
|
||||
|
||||
// 识别十六进制且已去掉0x头部
|
||||
static long parseHexadecimal(const std::string& input);
|
||||
};
|
||||
}
|
21
mixplus/main.cpp
Normal file
21
mixplus/main.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include <iostream>
|
||||
#include <parser.h>
|
||||
|
||||
int main(const int argc, const char** argv)
|
||||
{
|
||||
try
|
||||
{
|
||||
const auto value = mixplus::Parser::parseAndAdd(argc, argv);
|
||||
|
||||
const auto result = mixplus::Parser::formatResult(value);
|
||||
|
||||
std::cout << result.hexadecimal << ' ' << result.digit << std::endl;
|
||||
}
|
||||
catch (std::invalid_argument& e)
|
||||
{
|
||||
std::cout << e.what() << std::endl;
|
||||
std::cout << "ERROR" << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
99
mixplus/src/parser.cpp
Normal file
99
mixplus/src/parser.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
#include "parser.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
long mixplus::Parser::parseDigit(const std::string& input)
|
||||
{
|
||||
long result = 0;
|
||||
|
||||
for (const char& c : input)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
{
|
||||
result = result * 10 + (c - '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::invalid_argument("The input string is invalid.");
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
long mixplus::Parser::parseHexadecimal(const std::string& input)
|
||||
{
|
||||
long result = 0;
|
||||
|
||||
for (const char& c : input)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
{
|
||||
result = result * 16 + (c - '0');
|
||||
}
|
||||
else if (c >= 'a' && c <= 'f')
|
||||
{
|
||||
result = result * 16 + (c - 'a' + 10);
|
||||
}
|
||||
else if (c >= 'A' && c <= 'F')
|
||||
{
|
||||
result = result * 16 + (c - 'A' + 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::invalid_argument("The input string is invalid.");
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
long mixplus::Parser::parseNumber(const std::string& input)
|
||||
{
|
||||
if (input.size() > 2 && (input[1] == 'x' || input[1] == 'X'))
|
||||
{
|
||||
return parseHexadecimal(input.substr(2));
|
||||
}
|
||||
|
||||
return parseDigit(input);
|
||||
}
|
||||
|
||||
long mixplus::Parser::parseAndAdd(const int argc, const char** argv)
|
||||
{
|
||||
// 程序名称 first second
|
||||
if (argc != 3)
|
||||
{
|
||||
throw std::invalid_argument("Less arguments is provided.");
|
||||
}
|
||||
|
||||
const auto a = std::string(argv[1]);
|
||||
const auto b = std::string(argv[2]);
|
||||
|
||||
const auto aValue = parseNumber(a);
|
||||
const auto bValue = parseNumber(b);
|
||||
|
||||
return aValue + bValue;
|
||||
}
|
||||
|
||||
Result mixplus::Parser::formatResult(const long value)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << std::hex;
|
||||
|
||||
ss << "0x";
|
||||
|
||||
// 处理负数:转换为无符号 long,输出补码形式
|
||||
if (value < 0)
|
||||
{
|
||||
ss << static_cast<unsigned long>(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
ss << value;
|
||||
}
|
||||
|
||||
return Result{
|
||||
.hexadecimal = ss.str(), .digit = value
|
||||
};
|
||||
}
|
10
mixplus/tests/CMakeLists.txt
Normal file
10
mixplus/tests/CMakeLists.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
enable_testing()
|
||||
|
||||
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} TEST_SRC)
|
||||
|
||||
add_executable(
|
||||
mixplus_test
|
||||
${TEST_SRC}
|
||||
)
|
||||
|
||||
target_link_libraries(mixplus_test GTest::gtest_main libmixplus)
|
28
mixplus/tests/smoke-tests.cpp
Normal file
28
mixplus/tests/smoke-tests.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
#include <parser.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(SmokeTests, ParseSuccesfullyTest)
|
||||
{
|
||||
ASSERT_EQ(16, mixplus::Parser::parseNumber("0x10"));
|
||||
ASSERT_EQ(1, mixplus::Parser::parseNumber("1"));
|
||||
ASSERT_EQ(1, mixplus::Parser::parseNumber("0x1"));
|
||||
}
|
||||
|
||||
TEST(SmokeTests, ParseFailedTest)
|
||||
{
|
||||
ASSERT_ANY_THROW(mixplus::Parser::parseNumber("0x0dragonegg"));
|
||||
ASSERT_ANY_THROW(mixplus::Parser::parseNumber("ox"));
|
||||
ASSERT_ANY_THROW(mixplus::Parser::parseNumber("oxdragon"));
|
||||
}
|
||||
|
||||
TEST(ParseAndAddTests, Test1)
|
||||
{
|
||||
const char* argv[3] = {"", "1", "2"};
|
||||
ASSERT_EQ(3, mixplus::Parser::parseAndAdd(3,argv));
|
||||
}
|
||||
|
||||
TEST(ParseAndAddTests, Test2)
|
||||
{
|
||||
const char* argv[3] = {"", "0x10", "2"};
|
||||
ASSERT_EQ(18, mixplus::Parser::parseAndAdd(3,argv));
|
||||
}
|
Reference in New Issue
Block a user