1 /* 2 * Copyright 2019, Andrew Lindesay <apl@lindesay.co.nz>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6 #include "ValidationFailureTest.h" 7 8 #include <cppunit/TestCaller.h> 9 #include <cppunit/TestSuite.h> 10 11 #include "ValidationFailure.h" 12 13 14 ValidationFailureTest::ValidationFailureTest() 15 { 16 } 17 18 19 ValidationFailureTest::~ValidationFailureTest() 20 { 21 } 22 23 24 void 25 ValidationFailureTest::TestDearchive() 26 { 27 BMessage nicknameMessage; 28 nicknameMessage.AddString("property", "nickname"); 29 nicknameMessage.AddString("message_0", "malformed"); 30 nicknameMessage.AddString("message_1", "required"); 31 32 BMessage passwordClearMessage; 33 passwordClearMessage.AddString("property", "passwordClear"); 34 passwordClearMessage.AddString("message_0", "required"); 35 36 BMessage validationFailuresMessage; 37 validationFailuresMessage.AddMessage("item_0", &nicknameMessage); 38 validationFailuresMessage.AddMessage("item_1", &passwordClearMessage); 39 40 // ---------------------- 41 ValidationFailures validationFailures(&validationFailuresMessage); 42 // ---------------------- 43 44 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Count failures", (int32) 2, 45 validationFailures.CountFailures()); 46 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Contains 'nickname'", true, 47 validationFailures.Contains("nickname")); 48 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Contains 'nickname:required'", true, 49 validationFailures.Contains("nickname", "required")); 50 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Contains 'nickname:malformed'", true, 51 validationFailures.Contains("nickname", "malformed")); 52 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Contains 'passwordClear:required'", true, 53 validationFailures.Contains("passwordClear", "required")); 54 } 55 56 57 void 58 ValidationFailureTest::TestArchive() 59 { 60 ValidationFailures failures; 61 failures.AddFailure("nickname", "malformed"); 62 failures.AddFailure("nickname", "required"); 63 failures.AddFailure("passwordClear", "required"); 64 BMessage validationFailuresMessage; 65 66 // ---------------------- 67 status_t archiveResult = failures.Archive(&validationFailuresMessage); 68 // ---------------------- 69 70 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Archive failure", B_OK, archiveResult); 71 BMessage validationFailureNicknameMessage; 72 BMessage validationFailurePasswordClearMessage; 73 74 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unable to find 'nickname'", B_OK, 75 FindMessageWithProperty("nickname", validationFailuresMessage, 76 validationFailureNicknameMessage)); 77 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unable to find 'passwordClear'", B_OK, 78 FindMessageWithProperty("passwordClear", validationFailuresMessage, 79 validationFailurePasswordClearMessage)); 80 81 BStringList validationFailureMessagesNickname; 82 BStringList validationFailureMessagesPasswordClear; 83 FindValidationMessages(validationFailureNicknameMessage, 84 validationFailureMessagesNickname); 85 FindValidationMessages(validationFailurePasswordClearMessage, 86 validationFailureMessagesPasswordClear); 87 88 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unable to find 'nickname:malformed'", 89 true, validationFailureMessagesNickname.HasString("malformed")); 90 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unable to find 'nickname:required'", 91 true, validationFailureMessagesNickname.HasString("required")); 92 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unexpected validation messages 'nickname'", 93 (int32) 2, validationFailureMessagesNickname.CountStrings()); 94 95 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unable to find 'passwordClear:required'", 96 true, validationFailureMessagesPasswordClear.HasString("required")); 97 CPPUNIT_ASSERT_EQUAL_MESSAGE("!Unexpected validation messages 'nickname'", 98 (int32) 1, validationFailureMessagesPasswordClear.CountStrings()); 99 } 100 101 102 /*static*/ void 103 ValidationFailureTest::AddTests(BTestSuite& parent) 104 { 105 CppUnit::TestSuite& suite = *new CppUnit::TestSuite( 106 "ValidationFailureTest"); 107 108 suite.addTest( 109 new CppUnit::TestCaller<ValidationFailureTest>( 110 "ValidationFailureTest::TestArchive", 111 &ValidationFailureTest::TestArchive)); 112 suite.addTest( 113 new CppUnit::TestCaller<ValidationFailureTest>( 114 "ValidationFailureTest::TestDearchive", 115 &ValidationFailureTest::TestDearchive)); 116 117 parent.addTest("ValidationFailureTest", &suite); 118 } 119 120 121 /*static*/ status_t 122 ValidationFailureTest::FindMessageWithProperty( 123 const char* property, BMessage& validationFailuresMessage, 124 BMessage& validationFailureMessage) 125 { 126 status_t result = B_OK; 127 128 for (int32 i = 0; result == B_OK; i++) { 129 BString name = "item_"; 130 name << i; 131 result = validationFailuresMessage.FindMessage(name, 132 &validationFailureMessage); 133 134 if (result == B_OK) { 135 BString messageProperty; 136 result = validationFailureMessage.FindString("property", 137 &messageProperty); 138 139 if (result == B_OK && messageProperty == property) 140 return result; 141 } 142 } 143 144 return result; 145 } 146 147 148 /*static*/ void 149 ValidationFailureTest::FindValidationMessages( 150 BMessage& validationFailureMessage, BStringList& validationMessages) 151 { 152 status_t result = B_OK; 153 154 for (int32 i = 0; result == B_OK; i++) { 155 BString validationMessage; 156 BString name = "message_"; 157 name << i; 158 result = validationFailureMessage.FindString(name, 159 &validationMessage); 160 161 if (result == B_OK) { 162 validationMessages.Add(validationMessage); 163 } 164 } 165 }