Skip to content

Commit

Permalink
Cleaning up tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gershnik committed Jan 6, 2024
1 parent 870a321 commit 83c4c06
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 264 deletions.
4 changes: 0 additions & 4 deletions Translit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
442D25AE2B088B5700204800 /* about.html in Resources */ = {isa = PBXBuildFile; fileRef = 442D25AD2B088B5700204800 /* about.html */; };
442D25B22B089F2F00204800 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 442D25B12B089F2F00204800 /* WebKit.framework */; };
442D25B42B0A2E1B00204800 /* Transliterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 445D1E602AFE364900FA1C07 /* Transliterator.cpp */; };
442D25BF2B0B2D6600204800 /* TestCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 442D25BE2B0B2D6600204800 /* TestCommon.mm */; };
442D25CA2B0B93D500204800 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 442D25C82B0B93D500204800 /* InfoPlist.strings */; };
442D25CC2B0CC97100204800 /* Uninstall.mm in Sources */ = {isa = PBXBuildFile; fileRef = 442D25CB2B0CC97100204800 /* Uninstall.mm */; };
445D1E4C2AFE2C6C00FA1C07 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 445D1E4B2AFE2C6C00FA1C07 /* AppDelegate.mm */; };
Expand Down Expand Up @@ -109,7 +108,6 @@
442D25BB2B0ADC3A00204800 /* create-release */ = {isa = PBXFileReference; explicitFileType = text.script.python; path = "create-release"; sourceTree = "<group>"; };
442D25BC2B0ADCB200204800 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
442D25BD2B0B2D2C00204800 /* TestCommon.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = TestCommon.hpp; sourceTree = "<group>"; };
442D25BE2B0B2D6600204800 /* TestCommon.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TestCommon.mm; sourceTree = "<group>"; };
442D25C02B0B308000204800 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
442D25C12B0B8C6C00204800 /* format-file */ = {isa = PBXFileReference; explicitFileType = text.script.python; path = "format-file"; sourceTree = "<group>"; };
442D25C62B0B93A500204800 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand Down Expand Up @@ -361,7 +359,6 @@
44C675832B02153F003A5BDE /* TestRu.mm */,
44B947CE2B4698E500B68C7E /* TestPerf.mm */,
442D25BD2B0B2D2C00204800 /* TestCommon.hpp */,
442D25BE2B0B2D6600204800 /* TestCommon.mm */,
4475AD332B131F80008DA122 /* Main.xctestplan */,
4475AD342B132242008DA122 /* Perf.xctestplan */,
);
Expand Down Expand Up @@ -702,7 +699,6 @@
44B947D12B469B4C00B68C7E /* TestMapper.mm in Sources */,
44B947CF2B4698E500B68C7E /* TestPerf.mm in Sources */,
44C675842B02153F003A5BDE /* TestRu.mm in Sources */,
442D25BF2B0B2D6600204800 /* TestCommon.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
131 changes: 105 additions & 26 deletions Translit/tests/TestCommon.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,112 @@

#import <XCTest/XCTest.h>

struct ResultPayload {
ResultPayload() = default;
ResultPayload(std::u16string_view all_,
size_t completedSize_,
bool matchedSomething_):
all(all_),
completedSize(completedSize_),
matchedSomething(matchedSomething_)
{}

std::u16string_view all;
size_t completedSize;
bool matchedSomething;

friend bool operator==(const ResultPayload &, const ResultPayload &) = default;
friend bool operator!=(const ResultPayload &, const ResultPayload &) = default;
};

@interface Result : NSObject
-(instancetype) initWithPayload:(ResultPayload)payload ;
-(instancetype) initWithTransliterator:(const Transliterator &)tr;
@end

#define XCTAssertTranslit(tr, str, size, matched) \
XCTAssertEqualObjects([[Result alloc] initWithTransliterator:tr], \
[[Result alloc] initWithPayload:ResultPayload((str), (size), (matched))]);
#include <sstream>
#include <cxxabi.h>

namespace TestUtil {
using std::to_string;

template<class T>
concept TestDescriptable = requires(const T & obj) {
{ testDescription(obj) } -> std::same_as<NSString *>;
};


template<class T>
concept ToStringDescriptable = requires(T obj) {
{ to_string(obj) } -> std::same_as<std::string>;
};


template<class T>
concept OStreamDescriptable = requires(T obj, std::ostream & str) {
{ str << obj };
};

inline auto demangle(const char * name) -> std::string {

int status = 0;
std::unique_ptr<char, void(*)(void*)> res {
abi::__cxa_demangle(name, nullptr, nullptr, &status),
std::free
};
return (status==0) ? res.get() : name ;
}

template<class T>
auto describeForTest(const T & val) {
if constexpr (TestDescriptable<T>) {
return testDescription(val);
}
else if constexpr (ToStringDescriptable<T>) {
using std::to_string;
auto str = to_string(val);
return @(str.c_str());
} else if constexpr (OStreamDescriptable<T>) {
std::ostringstream str;
str << val;
return @(str.str().c_str());
} else {
return [NSString stringWithFormat:@"%s object", demangle(typeid(T).name()).c_str()];
}
}
}

#define XCTPrimitiveAssertCpp(test, op, type, expression1, expressionStr1, expression2, expressionStr2, ...) \
({ \
_XCT_TRY { \
__typeof__(expression1) expressionValue1 = (expression1); \
__typeof__(expression2) expressionValue2 = (expression2); \
if (expressionValue1 != expressionValue2) { \
_XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_Equal, 0, expressionStr1, expressionStr2, TestUtil::describeForTest(expressionValue1), TestUtil::describeForTest(expressionValue2)), __VA_ARGS__); \
} \
} \
_XCT_CATCH (_XCTestCaseInterruptionException *interruption) { [interruption raise]; } \
_XCT_CATCH (...) { \
NSString *_xct_reason = _XCTGetCurrentExceptionReason(); \
_XCTRegisterUnexpectedFailure(test, _XCTFailureDescription((type), 1, expressionStr1, expressionStr2, _xct_reason), __VA_ARGS__); \
} \
})

#define XCTAssertCppEqual(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, !=, _XCTAssertion_Equal, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define XCTAssertCppNotEqual(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, ==, _XCTAssertion_NotEqual, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define XCTAssertCppGreaterThan(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, <=, _XCTAssertion_GreaterThan, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define XCTAssertCppGreaterThanOrEqual(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, <, _XCTAssertion_GreaterThanOrEqual, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define XCTAssertCppLessThan(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, >=, _XCTAssertion_LessThan, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define XCTAssertCppLessThanOrEqual(expression1, expression2, ...) \
XCTPrimitiveAssertCpp(nil, >, _XCTAssertion_LessThanOrEqual, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)


namespace std {
template<class T>
auto testDescription(const optional<T> & opt) {
if (opt)
return TestUtil::describeForTest(*opt);
return @"std::nullopt";
}

inline auto testDescription(const u16string_view & str) {
return [NSString stringWithCharacters:(const unichar *)str.data() length:str.size()];
}
}


#define XCTAssertTranslit(tr, str, size, matched) ({ \
XCTAssertCppEqual((tr).result(), (str)); \
XCTAssertCppEqual((tr).completedSize(), (size)); \
XCTAssertCppEqual((tr).matchedSomething(), (matched)); \
})


#endif
45 changes: 0 additions & 45 deletions Translit/tests/TestCommon.mm

This file was deleted.

48 changes: 24 additions & 24 deletions Translit/tests/TestMapper.mm
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright (c) 2023, Eugene Gershnik
// SPDX-License-Identifier: GPL-3.0-or-later

#import <XCTest/XCTest.h>
#include "TestCommon.hpp"

#include "../src/Mapper.hpp"

Expand All @@ -16,56 +16,56 @@ @implementation TestMapper

- (void)testOnlyEmptyString {
auto mapper = makeMapper<std::u16string, 42, Mapping{0, u""}>();
XCTAssertEqual(mapper(u""s), 0);
XCTAssertEqual(mapper(u"a"s), 42);
XCTAssertCppEqual(mapper(u""s), 0);
XCTAssertCppEqual(mapper(u"a"s), 42);
}

- (void)testDisjointStrings {
{
auto mapper = makeMapper<std::u16string, 42, Mapping{0, u"b"}, Mapping{1, u"c"}, Mapping{2, u"a"}>();
XCTAssertEqual(mapper(u""s), 42);
XCTAssertEqual(mapper(u"a"s), 2);
XCTAssertEqual(mapper(u"b"s), 0);
XCTAssertEqual(mapper(u"c"s), 1);
XCTAssertEqual(mapper(u" "s), 42);
XCTAssertCppEqual(mapper(u""s), 42);
XCTAssertCppEqual(mapper(u"a"s), 2);
XCTAssertCppEqual(mapper(u"b"s), 0);
XCTAssertCppEqual(mapper(u"c"s), 1);
XCTAssertCppEqual(mapper(u" "s), 42);
}

{
auto mapper = makeMapper<std::u16string, 42, Mapping{0, u"ef"}, Mapping{1, u"cd"}, Mapping{2, u"ab"}>();
XCTAssertEqual(mapper(u""s), 42);
XCTAssertEqual(mapper(u"a"s), 42);
XCTAssertEqual(mapper(u"b"s), 42);
XCTAssertEqual(mapper(u"cd"s), 1);
XCTAssertCppEqual(mapper(u""s), 42);
XCTAssertCppEqual(mapper(u"a"s), 42);
XCTAssertCppEqual(mapper(u"b"s), 42);
XCTAssertCppEqual(mapper(u"cd"s), 1);
}

}

- (void)testOverlappingStrings {
{
auto mapper = makeMapper<std::u16string, 42, Mapping{0, u"b"}, Mapping{1, u"bcd"}>();
XCTAssertEqual(mapper(u"b"s), 0);
XCTAssertEqual(mapper(u"bc"s), 42);
XCTAssertEqual(mapper(u"bcd"s), 1);
XCTAssertCppEqual(mapper(u"b"s), 0);
XCTAssertCppEqual(mapper(u"bc"s), 42);
XCTAssertCppEqual(mapper(u"bcd"s), 1);
}
{
auto mapper = makeMapper<std::u16string, 42, Mapping{0, u"bc"}, Mapping{1, u"bd"}, Mapping{2, u"bdd"}>();
XCTAssertEqual(mapper(u"b"s), 42);
XCTAssertEqual(mapper(u"bc"s), 0);
XCTAssertEqual(mapper(u"bd"s), 1);
XCTAssertEqual(mapper(u"bdd"s), 2);
XCTAssertCppEqual(mapper(u"b"s), 42);
XCTAssertCppEqual(mapper(u"bc"s), 0);
XCTAssertCppEqual(mapper(u"bd"s), 1);
XCTAssertCppEqual(mapper(u"bdd"s), 2);
}
{
auto mapper = makeMapper<std::string, 42, Mapping{0, "bd"}, Mapping{1, "bddq"}>();
XCTAssertEqual(mapper("bd"s), 0);
XCTAssertEqual(mapper("bddc"s), 42);
XCTAssertEqual(mapper("bddq"s), 1);
XCTAssertCppEqual(mapper("bd"s), 0);
XCTAssertCppEqual(mapper("bddc"s), 42);
XCTAssertCppEqual(mapper("bddq"s), 1);
}
}

- (void)testRepeatedStrings {
constexpr auto mapper = makeMapper<std::string_view, 42, Mapping{0, "ab"}, Mapping{1, "cd"}, Mapping{2, "ab"}>();
XCTAssertEqual(mapper("ab"sv), 2);
XCTAssertEqual(mapper("cd"sv), 1);
XCTAssertCppEqual(mapper("ab"sv), 2);
XCTAssertCppEqual(mapper("cd"sv), 1);
}


Expand Down
Loading

0 comments on commit 83c4c06

Please sign in to comment.