Introduced google test for L33
This commit is contained in:
26
Makefile
26
Makefile
@@ -9,18 +9,22 @@ VAL_DIR = validator
|
|||||||
INC_DIR = include
|
INC_DIR = include
|
||||||
CHK_DIR = checker
|
CHK_DIR = checker
|
||||||
|
|
||||||
|
TEST_DIR = src/test
|
||||||
|
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
BUILD_TARGET_DIR = $(BUILD_DIR)/target
|
BUILD_TARGET_DIR = $(BUILD_DIR)/target
|
||||||
BUILD_GEN_DIR = $(BUILD_DIR)/gen
|
BUILD_GEN_DIR = $(BUILD_DIR)/gen
|
||||||
BUILD_VAL_DIR = $(BUILD_DIR)/val
|
BUILD_VAL_DIR = $(BUILD_DIR)/val
|
||||||
BUILD_CHK_DIR = $(BUILD_DIR)/chk
|
BUILD_CHK_DIR = $(BUILD_DIR)/chk
|
||||||
|
BUILD_TEST_DIR = $(BUILD_DIR)/test
|
||||||
LOG_DIR = $(BUILD_DIR)/logs
|
LOG_DIR = $(BUILD_DIR)/logs
|
||||||
|
|
||||||
BUILD_IN_DIR = $(BUILD_DIR)/input
|
BUILD_IN_DIR = $(BUILD_DIR)/input
|
||||||
BUILD_OUT_A_DIR = $(BUILD_DIR)/$(SOL_A)_out
|
BUILD_OUT_A_DIR = $(BUILD_DIR)/$(SOL_A)_out
|
||||||
BUILD_OUT_B_DIR = $(BUILD_DIR)/$(SOL_B)_out
|
BUILD_OUT_B_DIR = $(BUILD_DIR)/$(SOL_B)_out
|
||||||
|
|
||||||
DIRS = $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR)
|
|
||||||
|
DIRS = $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) $(BUILD_TEST_DIR)
|
||||||
|
|
||||||
CXXFLAGS = -Wall -O2 -std=c++2a
|
CXXFLAGS = -Wall -O2 -std=c++2a
|
||||||
GENFLAGS = -N $(N) -M $(M) -pm $(pm)
|
GENFLAGS = -N $(N) -M $(M) -pm $(pm)
|
||||||
@@ -56,7 +60,7 @@ pm ?= 0.1
|
|||||||
all: $(SOLS_EXE) $(GENS_EXE) $(VAL_EXE) $(CHK_EXE) $(DIRS)
|
all: $(SOLS_EXE) $(GENS_EXE) $(VAL_EXE) $(CHK_EXE) $(DIRS)
|
||||||
@echo "All executables compiled in $(BUILD_DIR)/"
|
@echo "All executables compiled in $(BUILD_DIR)/"
|
||||||
|
|
||||||
$(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR):
|
$(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) $(BUILD_TEST_DIR):
|
||||||
@echo "Creating directory: $@"
|
@echo "Creating directory: $@"
|
||||||
@mkdir -p $@
|
@mkdir -p $@
|
||||||
|
|
||||||
@@ -83,6 +87,10 @@ $(BUILD_IN_DIR)/input%: $(GEN_TO_RUN) | $(BUILD_IN_DIR)
|
|||||||
echo "Using Seed: $$SEED" >&2; \
|
echo "Using Seed: $$SEED" >&2; \
|
||||||
./$(GEN_TO_RUN) $(GENFLAGS) "$$SEED" > $@
|
./$(GEN_TO_RUN) $(GENFLAGS) "$$SEED" > $@
|
||||||
|
|
||||||
|
$(BUILD_TEST_DIR)/%: $(TEST_DIR)/%.cpp | $(BUILD_TEST_DIR)
|
||||||
|
@echo "Compiling Unit Test $< -> $@"
|
||||||
|
$(CXX) $(CXXFLAGS) -I$(INC_DIR) -I$(SRC_DIR)/bsb -o $@ $< -lgtest -lgtest_main -pthread
|
||||||
|
|
||||||
.PHONY: force
|
.PHONY: force
|
||||||
force:
|
force:
|
||||||
|
|
||||||
@@ -152,10 +160,18 @@ else
|
|||||||
@echo "OK: ID=$(id) outputs match!"
|
@echo "OK: ID=$(id) outputs match!"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
UNIT_TEST_SRCS = $(wildcard $(TEST_DIR)/*.cpp)
|
||||||
|
UNIT_TEST_NAMES = $(patsubst $(TEST_DIR)/%.cpp, %, $(UNIT_TEST_SRCS))
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: all $(LOG_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR)
|
test: all $(LOG_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR)
|
||||||
ifeq ($(id),)
|
ifdef target
|
||||||
|
@# Case 1: Unit Test 실행 (예: make test target=L33)
|
||||||
|
@echo "--- Running Unit Test Target: [$(target)] ---"
|
||||||
|
@$(MAKE) --no-print-directory $(BUILD_TEST_DIR)/$(target)
|
||||||
|
@echo "-------------------------------------------"
|
||||||
|
@./$(BUILD_TEST_DIR)/$(target)
|
||||||
|
else ifeq ($(id),)
|
||||||
@echo "--- Running $(TEST_COUNT) tests (Comparing $(SOL_A) vs $(SOL_B)) ---"
|
@echo "--- Running $(TEST_COUNT) tests (Comparing $(SOL_A) vs $(SOL_B)) ---"
|
||||||
@echo "--- Using Generator [$(gen)] (N=$(N), M=$(M)) ---"
|
@echo "--- Using Generator [$(gen)] (N=$(N), M=$(M)) ---"
|
||||||
@LOG_FILE=$(LOG_DIR)/test_run_$$(date +%Y%m%d_%H%M%S).log; \
|
@LOG_FILE=$(LOG_DIR)/test_run_$$(date +%Y%m%d_%H%M%S).log; \
|
||||||
@@ -194,6 +210,10 @@ else
|
|||||||
@$(MAKE) --no-print-directory check id=$(id) gen=$(gen) SOL_A=$(SOL_A) SOL_B=$(SOL_B) N=$(N) M=$(M)
|
@$(MAKE) --no-print-directory check id=$(id) gen=$(gen) SOL_A=$(SOL_A) SOL_B=$(SOL_B) N=$(N) M=$(M)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
.PHONY: $(UNIT_TEST_NAMES)
|
||||||
|
$(UNIT_TEST_NAMES):
|
||||||
|
@$(MAKE) --no-print-directory test target=$@
|
||||||
|
|
||||||
.PHONY: bench
|
.PHONY: bench
|
||||||
bench: all
|
bench: all
|
||||||
ifeq ($(id),)
|
ifeq ($(id),)
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ int main(int argc, char *argv[]) {
|
|||||||
vector<ll> cnt(n + 1, 0);
|
vector<ll> cnt(n + 1, 0);
|
||||||
for (ll i = 0; i < m; ++i) {
|
for (ll i = 0; i < m; ++i) {
|
||||||
ll s = rnd.next(1uLL, n);
|
ll s = rnd.next(1uLL, n);
|
||||||
if(cnt[s] == n-1)
|
if (cnt[s] == n - 1) {
|
||||||
{
|
|
||||||
i--;
|
i--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
#include <boost/heap/fibonacci_heap.hpp>
|
#include <boost/heap/fibonacci_heap.hpp>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <iostream>
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <ostream>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@@ -329,6 +329,26 @@ class L33 {
|
|||||||
return {x, s};
|
return {x, s};
|
||||||
}
|
}
|
||||||
bool empty() const { return ptr.empty(); }
|
bool empty() const { return ptr.empty(); }
|
||||||
|
|
||||||
|
void _debug(ostream& os)
|
||||||
|
{
|
||||||
|
os<<"D0: "<<endl;
|
||||||
|
for(auto [B, it_BLIST]:D0)
|
||||||
|
{
|
||||||
|
os<<"["<<B<<"] : ";
|
||||||
|
auto &block = *it_BLIST;
|
||||||
|
for(auto [key, val] : block) os << "(" << key << " : " << val << ") ";
|
||||||
|
os<<endl;
|
||||||
|
}
|
||||||
|
os<<"D1: "<<endl;
|
||||||
|
for(auto [B, it_BLIST]:D1)
|
||||||
|
{
|
||||||
|
os<<"["<<B<<"] : ";
|
||||||
|
auto &block = *it_BLIST;
|
||||||
|
for(auto [key, val] : block) os << "(" << key << " : " << val << ") ";
|
||||||
|
os<<endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace GMS
|
} // namespace GMS
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "bsb.hpp"
|
#include "L33.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace GMS;
|
using namespace GMS;
|
||||||
|
|||||||
93
src/test/L33-test1.cpp
Normal file
93
src/test/L33-test1.cpp
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <L33.hpp>
|
||||||
|
// #include <limits>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
TEST(L33_test, debug_small) {
|
||||||
|
const unsigned seed = 998244353;
|
||||||
|
const uint N = 10, M = 1, MX = 1e9;
|
||||||
|
|
||||||
|
std::mt19937 gen(seed);
|
||||||
|
std::uniform_int_distribution<int> dis(1, MX);
|
||||||
|
|
||||||
|
GMS::L33<int,int> D(M, MX);
|
||||||
|
std::map<int,int> mp;
|
||||||
|
|
||||||
|
std::vector<int> keys;
|
||||||
|
for(int i=1;i<=N;i++) keys.push_back(i);
|
||||||
|
|
||||||
|
std::shuffle(keys.begin(), keys.end(), gen);
|
||||||
|
|
||||||
|
for(auto key:keys)
|
||||||
|
{
|
||||||
|
int val = dis(gen);
|
||||||
|
std::cerr<<key<<": "<<val<<std::endl;
|
||||||
|
|
||||||
|
mp[val] = key;
|
||||||
|
|
||||||
|
D.Insert(key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr<<"[!] mp: "<<std::endl;
|
||||||
|
for(auto [val, key] : mp)
|
||||||
|
std::cerr<<key<<": "<<val<<std::endl;
|
||||||
|
|
||||||
|
D._debug(std::cerr);
|
||||||
|
|
||||||
|
std::cerr<<"[!] D: "<<std::endl;
|
||||||
|
int bef = 0;
|
||||||
|
while(!D.empty())
|
||||||
|
{
|
||||||
|
auto [B, keys] = D.Pull();
|
||||||
|
|
||||||
|
std::cerr<<"[!] new pull; B : "<<B<<" ("<<keys.size()<<')'<<": ";
|
||||||
|
for(auto i:keys) std::cerr<<i<<' ';
|
||||||
|
std::cerr<<std::endl;
|
||||||
|
|
||||||
|
D._debug(std::cerr);
|
||||||
|
|
||||||
|
EXPECT_LT(bef, B);
|
||||||
|
bef = B;
|
||||||
|
std::cerr<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(L33_test, DISABLED_emptying_test1) {
|
||||||
|
const double inf = 100;
|
||||||
|
const unsigned seed = 998244353;
|
||||||
|
const uint N = 2328, M = 10, MX = 1e9;
|
||||||
|
|
||||||
|
std::mt19937 gen(seed);
|
||||||
|
std::uniform_int_distribution<int> dis(1, MX);
|
||||||
|
std::uniform_real_distribution<double> valdis(-inf, inf);
|
||||||
|
|
||||||
|
GMS::L33<int, double> D(M, inf);
|
||||||
|
|
||||||
|
std::vector<int> vec;
|
||||||
|
for (int i = 1; i <= N; i++) vec.push_back(i);
|
||||||
|
|
||||||
|
std::shuffle(vec.begin(), vec.end(), gen);
|
||||||
|
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
D.Insert(vec[i], valdis(gen));
|
||||||
|
}
|
||||||
|
|
||||||
|
int cnt = 0; double bef = -inf;
|
||||||
|
|
||||||
|
while(!D.empty())
|
||||||
|
{
|
||||||
|
auto [B, v] = D.Pull();
|
||||||
|
// std::cerr<<B<<' '<<v.size()<<std::endl;
|
||||||
|
cnt += v.size();
|
||||||
|
|
||||||
|
EXPECT_TRUE(D.empty() || (v.size() == M));
|
||||||
|
EXPECT_LE(bef, B);
|
||||||
|
bef = B;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ(cnt, N);
|
||||||
|
|
||||||
|
int result = 2 + 2;
|
||||||
|
EXPECT_EQ(result, 4);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user