init: gtest and quiz 1.

This commit is contained in:
2025-05-19 21:09:08 +08:00
commit 992103fd7b
258 changed files with 113483 additions and 0 deletions

11
mixplus/CMakeLists.txt Normal file
View 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
View 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
View 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
View 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
};
}

View 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)

View 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));
}