-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added Unit Testing and E2E Testing with Catch2:
- Added Catch2 header file for Testing - Added unit testing for all formatting functions - Fixed bugs with boldify and italicize functions - Added E2E testing, comparing files - Updated CONTRIBUTING.md with Testing info
- Loading branch information
1 parent
85966b8
commit 1772302
Showing
13 changed files
with
18,221 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--- | ||
Checks: '-*,clang-analyzer-apiModeling.StdCLibraryFunctions,clang-analyzer-apiModeling.TrustNonnull,clang-analyzer-apiModeling.google.GTest,clang-analyzer-apiModeling.llvm.CastValue,clang-analyzer-apiModeling.llvm.ReturnValue,clang-analyzer-core.CallAndMessage,clang-analyzer-core.CallAndMessageModeling,clang-analyzer-core.DivideZero,clang-analyzer-core.DynamicTypePropagation,clang-analyzer-core.NonNullParamChecker,clang-analyzer-core.NonnilStringConstants,clang-analyzer-core.NullDereference,clang-analyzer-core.StackAddrEscapeBase,clang-analyzer-core.StackAddressEscape,clang-analyzer-core.UndefinedBinaryOperatorResult,clang-analyzer-core.VLASize,clang-analyzer-core.builtin.BuiltinFunctions,clang-analyzer-core.builtin.NoReturnFunctions,clang-analyzer-core.uninitialized.ArraySubscript,clang-analyzer-core.uninitialized.Assign,clang-analyzer-core.uninitialized.Branch,clang-analyzer-core.uninitialized.CapturedBlockVariable,clang-analyzer-core.uninitialized.UndefReturn,clang-analyzer-cplusplus.InnerPointer,clang-analyzer-cplusplus.Move,clang-analyzer-cplusplus.NewDelete,clang-analyzer-cplusplus.NewDeleteLeaks,clang-analyzer-cplusplus.PlacementNew,clang-analyzer-cplusplus.PureVirtualCall,clang-analyzer-cplusplus.SelfAssignment,clang-analyzer-cplusplus.SmartPtrModeling,clang-analyzer-cplusplus.VirtualCallModeling,clang-analyzer-deadcode.DeadStores,clang-analyzer-fuchsia.HandleChecker,clang-analyzer-nullability.NullPassedToNonnull,clang-analyzer-nullability.NullReturnedFromNonnull,clang-analyzer-nullability.NullabilityBase,clang-analyzer-nullability.NullableDereferenced,clang-analyzer-nullability.NullablePassedToNonnull,clang-analyzer-nullability.NullableReturnedFromNonnull,clang-analyzer-optin.cplusplus.UninitializedObject,clang-analyzer-optin.cplusplus.VirtualCall,clang-analyzer-optin.mpi.MPI-Checker,clang-analyzer-optin.osx.OSObjectCStyleCast,clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker,clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker,clang-analyzer-optin.performance.GCDAntipattern,clang-analyzer-optin.performance.Padding,clang-analyzer-optin.portability.UnixAPI,clang-analyzer-osx.API,clang-analyzer-osx.MIG,clang-analyzer-osx.NSOrCFErrorDerefChecker,clang-analyzer-osx.NumberObjectConversion,clang-analyzer-osx.OSObjectRetainCount,clang-analyzer-osx.ObjCProperty,clang-analyzer-osx.SecKeychainAPI,clang-analyzer-osx.cocoa.AtSync,clang-analyzer-osx.cocoa.AutoreleaseWrite,clang-analyzer-osx.cocoa.ClassRelease,clang-analyzer-osx.cocoa.Dealloc,clang-analyzer-osx.cocoa.IncompatibleMethodTypes,clang-analyzer-osx.cocoa.Loops,clang-analyzer-osx.cocoa.MissingSuperCall,clang-analyzer-osx.cocoa.NSAutoreleasePool,clang-analyzer-osx.cocoa.NSError,clang-analyzer-osx.cocoa.NilArg,clang-analyzer-osx.cocoa.NonNilReturnValue,clang-analyzer-osx.cocoa.ObjCGenerics,clang-analyzer-osx.cocoa.RetainCount,clang-analyzer-osx.cocoa.RetainCountBase,clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak,clang-analyzer-osx.cocoa.SelfInit,clang-analyzer-osx.cocoa.SuperDealloc,clang-analyzer-osx.cocoa.UnusedIvars,clang-analyzer-osx.cocoa.VariadicMethodTypes,clang-analyzer-osx.coreFoundation.CFError,clang-analyzer-osx.coreFoundation.CFNumber,clang-analyzer-osx.coreFoundation.CFRetainRelease,clang-analyzer-osx.coreFoundation.containers.OutOfBounds,clang-analyzer-osx.coreFoundation.containers.PointerSizedValues,clang-analyzer-security.FloatLoopCounter,clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,clang-analyzer-security.insecureAPI.SecuritySyntaxChecker,clang-analyzer-security.insecureAPI.UncheckedReturn,clang-analyzer-security.insecureAPI.bcmp,clang-analyzer-security.insecureAPI.bcopy,clang-analyzer-security.insecureAPI.bzero,clang-analyzer-security.insecureAPI.decodeValueOfObjCType,clang-analyzer-security.insecureAPI.getpw,clang-analyzer-security.insecureAPI.gets,clang-analyzer-security.insecureAPI.mkstemp,clang-analyzer-security.insecureAPI.mktemp,clang-analyzer-security.insecureAPI.rand,clang-analyzer-security.insecureAPI.strcpy,clang-analyzer-security.insecureAPI.vfork,clang-analyzer-unix.API,clang-analyzer-unix.DynamicMemoryModeling,clang-analyzer-unix.Malloc,clang-analyzer-unix.MallocSizeof,clang-analyzer-unix.MismatchedDeallocator,clang-analyzer-unix.Vfork,clang-analyzer-unix.cstring.BadSizeArg,clang-analyzer-unix.cstring.CStringModeling,clang-analyzer-unix.cstring.NullArg,clang-analyzer-valist.CopyToSelf,clang-analyzer-valist.Uninitialized,clang-analyzer-valist.Unterminated,clang-analyzer-valist.ValistBase,clang-analyzer-webkit.NoUncountedMemberChecker,clang-analyzer-webkit.RefCntblBaseVirtualDtor' | ||
WarningsAsErrors: '' | ||
HeaderFilterRegex: '.*' | ||
FormatStyle: 'file' | ||
User: joshua |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
//#define CATCH_CONFIG_MAIN | ||
|
||
#include <iostream> | ||
#include <fstream> | ||
#include <string> | ||
#include "catch.hpp" | ||
#include "Formatter.h" | ||
|
||
void inputManager(string input, string output); | ||
|
||
bool filesMatch(string filePath1, string filePath2) | ||
{ | ||
std::ifstream file1(filePath1); | ||
std::ifstream file2(filePath2); | ||
|
||
if (file1.fail() || file2.fail()) | ||
{ | ||
return false; | ||
} | ||
|
||
if (file1.tellg() != file2.tellg()) | ||
{ | ||
return false; | ||
} | ||
|
||
file1.seekg(0, std::ifstream::beg); | ||
file2.seekg(0, std::ifstream::beg); | ||
|
||
return std::equal(std::istreambuf_iterator<char>(file1.rdbuf()), std::istreambuf_iterator<char>(), | ||
std::istreambuf_iterator<char>(file2.rdbuf())); | ||
} | ||
|
||
TEST_CASE("Italicize function", "[italics]") | ||
{ | ||
Formatter test; | ||
SECTION("Strings with * markdown") | ||
{ | ||
REQUIRE(test.italicize("*Hello World*") == "<i>Hello World</i>"); | ||
REQUIRE(test.italicize("*Testing 123*") == "<i>Testing 123</i>"); | ||
} | ||
SECTION("String with _ markdown") | ||
{ | ||
REQUIRE(test.italicize("_This is a sentence_") == "<i>This is a sentence</i>"); | ||
} | ||
SECTION("Empty string") | ||
{ | ||
REQUIRE(test.italicize("") == ""); | ||
} | ||
SECTION("String with one *") | ||
{ | ||
REQUIRE(test.italicize("*Hello World") == "*Hello World"); | ||
} | ||
SECTION("String with one _") | ||
{ | ||
REQUIRE(test.italicize("_Hello World") == "_Hello World"); | ||
} | ||
} | ||
|
||
TEST_CASE("Boldify function", "[bold]") | ||
{ | ||
Formatter test; | ||
SECTION("Strings with ** markdown") | ||
{ | ||
REQUIRE(test.boldify("**Hello World**") == "<b>Hello World</b>"); | ||
REQUIRE(test.boldify("**Testing 123**") == "<b>Testing 123</b>"); | ||
} | ||
SECTION("String with _ markdown") | ||
{ | ||
REQUIRE(test.boldify("__This is a sentence__") == "<b>This is a sentence</b>"); | ||
} | ||
SECTION("Empty string") | ||
{ | ||
REQUIRE(test.boldify("") == ""); | ||
} | ||
SECTION("String with one **") | ||
{ | ||
REQUIRE(test.boldify("**Hello World") == "**Hello World"); | ||
} | ||
SECTION("String with one __") | ||
{ | ||
REQUIRE(test.boldify("__Hello World") == "__Hello World"); | ||
} | ||
} | ||
|
||
TEST_CASE("Inline Code function", "[code]") | ||
{ | ||
Formatter test; | ||
SECTION("Strings with ` markdown") | ||
{ | ||
REQUIRE(test.inlineCode("`Hello World`") == "<code>Hello World</code>"); | ||
REQUIRE(test.inlineCode("`Testing 123`") == "<code>Testing 123</code>"); | ||
} | ||
SECTION("Empty string") | ||
{ | ||
REQUIRE(test.inlineCode("") == ""); | ||
} | ||
SECTION("String with one `") | ||
{ | ||
REQUIRE(test.inlineCode("`Hello World") == "`Hello World"); | ||
} | ||
} | ||
|
||
TEST_CASE("Trim Whitespace function", "[trim]") | ||
{ | ||
Formatter test; | ||
SECTION("Strings with front and back whitespace") | ||
{ | ||
REQUIRE(test.trim(" Hello World ") == "Hello World"); | ||
} | ||
SECTION("Empty string") | ||
{ | ||
REQUIRE(test.trim("") == ""); | ||
} | ||
SECTION("String with only front whitespace") | ||
{ | ||
REQUIRE(test.trim(" Hello World") == "Hello World"); | ||
} | ||
SECTION("String with only back whitespace") | ||
{ | ||
REQUIRE(test.trim("Hello World ") == "Hello World"); | ||
} | ||
SECTION("String with no extra whitespace") | ||
{ | ||
REQUIRE(test.trim("Hello World") == "Hello World"); | ||
} | ||
} | ||
|
||
TEST_CASE("E2E", "[E2E]") | ||
{ | ||
SECTION("Check if TXT file matches snapshot") | ||
{ | ||
inputManager("./test/test.txt", "./test/output/"); | ||
REQUIRE(filesMatch("./test/output/test.html", "./test/snapshotTXT.html")); | ||
} | ||
SECTION("Check if MD file matches snapshot") | ||
{ | ||
inputManager("./test/test.md", "./test/output/"); | ||
REQUIRE(filesMatch("./test/output/test.html", "./test/snapshotMD.html")); | ||
} | ||
} |
Oops, something went wrong.