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
14ValidationFailureTest::ValidationFailureTest()
15{
16}
17
18
19ValidationFailureTest::~ValidationFailureTest()
20{
21}
22
23
24void
25ValidationFailureTest::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
57void
58ValidationFailureTest::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
103ValidationFailureTest::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
122ValidationFailureTest::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
149ValidationFailureTest::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}