OXYGENHUB
◆ main openmsx / src / unittest / find_closest_test.cc
1.8 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#include "catch.hpp"
2
3
#include "find_closest.h"
4
5
#include <array>
6
#include <chrono>
7
#include <functional>
8
#include <vector>
9
10
TEST_CASE("find_closest_basic_integer_cases")
11
{
12
	std::vector values = {2, 5, 9, 13, 21};
13
14
	SECTION("exact match returns zero distance")
15
	{
16
		auto [it, dist] = find_closest(values, 9);
17
		CHECK(it == values.begin() + 2);
18
		CHECK(dist == 0);
19
	}
20
21
	SECTION("before first element")
22
	{
23
		auto [it, dist] = find_closest(values, -3);
24
		CHECK(it == values.begin());
25
		CHECK(dist == 5);
26
	}
27
28
	SECTION("after last element")
29
	{
30
		auto [it, dist] = find_closest(values, 99);
31
		CHECK(it == values.end() - 1);
32
		CHECK(dist == 78);
33
	}
34
35
	SECTION("tie prefers earlier element")
36
	{
37
		auto [it, dist] = find_closest(values, 7);
38
		CHECK(it == values.begin() + 1); // 5 beats 9 when distances tie
39
		CHECK(dist == 2);
40
	}
41
42
	SECTION("middle selects nearest neighbour")
43
	{
44
		auto [it, dist] = find_closest(values, 12);
45
		CHECK(it == values.begin() + 3); // 13 is closest to 12
46
		CHECK(dist == 1);
47
	}
48
}
49
50
TEST_CASE("find_closest_handles_empty_range")
51
{
52
	std::vector<int> empty;
53
	auto [it, _] = find_closest(empty, 42);
54
	CHECK(it == empty.end());
55
}
56
57
TEST_CASE("find_closest_with_time_points_and_projection")
58
{
59
	struct Sample {
60
		int id;
61
		std::chrono::steady_clock::time_point time;
62
	};
63
64
	using namespace std::chrono_literals;
65
	std::array samples = {
66
	        Sample{1, std::chrono::steady_clock::time_point{0ms}},
67
	        Sample{2, std::chrono::steady_clock::time_point{10ms}},
68
	        Sample{3, std::chrono::steady_clock::time_point{30ms}}
69
	};
70
	auto [it, dist] = find_closest(
71
		samples, std::chrono::steady_clock::time_point{18ms}, {}, &Sample::time);
72
	REQUIRE(it != samples.end());
73
	CHECK(it->id == 2);
74
	CHECK(dist == 8ms);
75
	static_assert(std::is_same_v<decltype(dist), std::chrono::steady_clock::duration>);
76
}