mirror of https://github.com/dnomd343/klotski.git
				
				
			
				 4 changed files with 87 additions and 13 deletions
			
			
		@ -0,0 +1,75 @@ | 
				
			|||||
 | 
					#include <algorithm> | 
				
			||||
 | 
					#include "group.h" | 
				
			||||
 | 
					#include "tiny_pool.h" | 
				
			||||
 | 
					#include "gtest/gtest.h" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#define SHOULD_PANIC(FUNC) \ | 
				
			||||
 | 
					    try { \ | 
				
			||||
 | 
					        FUNC; EXPECT_STREQ("should panic", "but no panic"); \ | 
				
			||||
 | 
					    } catch (...) {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					using klotski::Group; | 
				
			||||
 | 
					using klotski::GroupCase; | 
				
			||||
 | 
					using klotski::GroupType; | 
				
			||||
 | 
					using klotski::CommonCode; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					using klotski::TYPE_ID_LIMIT; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					TEST(Group, group_info_invalid) { | 
				
			||||
 | 
					    SHOULD_PANIC(GroupCase::parse(GroupCase::info_t { | 
				
			||||
 | 
					        .type_id = TYPE_ID_LIMIT, | 
				
			||||
 | 
					        .group_id = 0, | 
				
			||||
 | 
					        .group_index = 0, | 
				
			||||
 | 
					    })) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    SHOULD_PANIC(GroupCase::parse(GroupCase::info_t { | 
				
			||||
 | 
					        .type_id = 0, | 
				
			||||
 | 
					        .group_id = static_cast<uint16_t>(GroupType(0).group_num()), | 
				
			||||
 | 
					        .group_index = 0, | 
				
			||||
 | 
					    })) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    SHOULD_PANIC(GroupCase::parse(GroupCase::info_t { | 
				
			||||
 | 
					        .type_id = 0, | 
				
			||||
 | 
					        .group_id = 0, | 
				
			||||
 | 
					        .group_index = Group(0, 0).size(), | 
				
			||||
 | 
					    })) | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					TEST(Group, group_info) { | 
				
			||||
 | 
					    auto test = [](GroupType group_type) { | 
				
			||||
 | 
					        for (uint32_t group_id = 0; group_id < group_type.group_num(); ++group_id) { | 
				
			||||
 | 
					            auto tmp = Group(group_type, group_id).cases(); | 
				
			||||
 | 
					            std::vector<CommonCode> cases(tmp.begin(), tmp.end()); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            auto min = *std::min_element(cases.begin(), cases.end()); | 
				
			||||
 | 
					            auto max = *std::max_element(cases.begin(), cases.end()); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            auto min_info = GroupCase::info_t{ | 
				
			||||
 | 
					                .type_id = static_cast<uint16_t>(group_type.unwrap()), | 
				
			||||
 | 
					                .group_id = static_cast<uint16_t>(group_id), | 
				
			||||
 | 
					                .group_index = 0, | 
				
			||||
 | 
					            }; | 
				
			||||
 | 
					            auto max_info = GroupCase::info_t{ | 
				
			||||
 | 
					                .type_id = static_cast<uint16_t>(group_type.unwrap()), | 
				
			||||
 | 
					                .group_id = static_cast<uint16_t>(group_id), | 
				
			||||
 | 
					                .group_index = static_cast<uint32_t>(cases.size() - 1), | 
				
			||||
 | 
					            }; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            EXPECT_EQ(min, GroupCase::parse(min_info)); | 
				
			||||
 | 
					            EXPECT_EQ(max, GroupCase::parse(max_info)); | 
				
			||||
 | 
					            EXPECT_EQ(min_info, GroupCase::encode(min)); | 
				
			||||
 | 
					            EXPECT_EQ(max_info, GroupCase::encode(max)); | 
				
			||||
 | 
					            EXPECT_EQ(min_info, GroupCase::encode(min.to_raw_code())); | 
				
			||||
 | 
					            EXPECT_EQ(max_info, GroupCase::encode(max.to_raw_code())); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    }; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    auto pool = TinyPool(); | 
				
			||||
 | 
					    for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { | 
				
			||||
 | 
					        pool.submit(test, GroupType(type_id)); | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    pool.boot(); | 
				
			||||
 | 
					    pool.join(); | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					// TODO: add group_info FAST mode
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue