Skip to content

Commit 4ad0d6f

Browse files
Adding compare helpers to the Object helpers (#122)
* Refactoring Datetime Add Helpers and unit tests * PR Suggestions * Adding compare helper methods and tests * Cleanup * Adding more tests * Cleanup * PR Feedbacks * Cleanup * PR Suggestions * PR Suggestions * PR Suggestions * PR Suggestions * Cleanup * Cleanup * Refactoring --------- Co-authored-by: Fabiano Suet da Silva <[email protected]>
1 parent 29bf555 commit 4ad0d6f

File tree

3 files changed

+358
-1
lines changed

3 files changed

+358
-1
lines changed

src/Handlebars.Net.Helpers/Helpers/ObjectHelpers.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using HandlebarsDotNet.Helpers.Attributes;
22
using HandlebarsDotNet.Helpers.Enums;
3+
using System;
34

45
namespace HandlebarsDotNet.Helpers.Helpers;
56

@@ -21,5 +22,89 @@ public string ToString(object? value)
2122
return value?.ToString() ?? string.Empty;
2223
}
2324

25+
[HandlebarsWriter(WriterType.Value, Name = "Object.IsNull")]
26+
public bool IsNull(object value)
27+
{
28+
return value is null;
29+
}
30+
31+
[HandlebarsWriter(WriterType.Value, Name = "Object.IsNotNull")]
32+
public bool IsNotNull(object value)
33+
{
34+
return value is not null;
35+
}
36+
37+
[HandlebarsWriter(WriterType.Value, Name = "Object.Equal")]
38+
public bool Equal(object value1, object value2)
39+
{
40+
if (value1 is null && value2 is null)
41+
{
42+
return true;
43+
}
44+
45+
if (value1 is null ^ value2 is null)
46+
{
47+
return false;
48+
}
49+
50+
return value1!.Equals(value2);
51+
}
52+
53+
[HandlebarsWriter(WriterType.Value, Name = "Object.NotEqual")]
54+
public bool NotEqual(object value1, object value2)
55+
{
56+
if (value1 is null && value2 is null)
57+
{
58+
return false;
59+
}
60+
61+
if (value1 is null ^ value2 is null)
62+
{
63+
return true;
64+
}
65+
66+
return !value1!.Equals(value2);
67+
}
68+
69+
[HandlebarsWriter(WriterType.Value, Name = "Object.GreaterThan")]
70+
public bool GreaterThan(object value1, object value2)
71+
{
72+
return CompareTo(value1, value2) > 0;
73+
}
74+
75+
[HandlebarsWriter(WriterType.Value, Name = "Object.GreaterThanEqual")]
76+
public bool GreaterThanEqual(object value1, object value2)
77+
{
78+
return Equal(value1, value2) || CompareTo(value1, value2) > 0;
79+
}
80+
81+
[HandlebarsWriter(WriterType.Value, Name = "Object.LowerThan")]
82+
public bool LowerThan(object value1, object value2)
83+
{
84+
return CompareTo(value1, value2) < 0;
85+
}
86+
87+
[HandlebarsWriter(WriterType.Value, Name = "Object.LowerThanEqual")]
88+
public bool LowerThanEqual(object value1, object value2)
89+
{
90+
return Equal(value1, value2) || CompareTo(value1, value2) < 0;
91+
}
92+
93+
[HandlebarsWriter(WriterType.Value, Name = "Object.CompareTo")]
94+
public int CompareTo(object value1, object value2)
95+
{
96+
if (value1 is null || value2 is null)
97+
{
98+
return 0;
99+
}
100+
101+
if (value1 is not IComparable comparable1 || value2 is not IComparable comparable2)
102+
{
103+
throw new ArgumentException("Both values should implement IComparable.");
104+
}
105+
106+
return comparable1.CompareTo(comparable2);
107+
}
108+
24109
public Category Category => Category.Object;
25110
}

test/Handlebars.Net.Helpers.Tests/Helpers/ObjectHelpersTests.cs

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using FluentAssertions;
33
using HandlebarsDotNet.Helpers.Helpers;
44
using Moq;
5+
using Newtonsoft.Json.Linq;
6+
using System;
57
using Xunit;
68

79
namespace HandlebarsDotNet.Helpers.Tests.Helpers;
@@ -39,4 +41,207 @@ public void ToStringWithNullValue()
3941
// Assert
4042
result.Should().Be(string.Empty);
4143
}
44+
45+
[CulturedTheory("en-us")]
46+
[InlineData(nameof(ObjectHelpers.Equal), "2000-01-01 0:00:00", "2000-01-01 0:00:00", true)]
47+
[InlineData(nameof(ObjectHelpers.Equal), "1999-01-01 0:00:00", "2000-01-01 0:00:00", false)]
48+
[InlineData(nameof(ObjectHelpers.Equal), "2000-01-01 0:00:00", "1999-01-01 0:00:00", false)]
49+
[InlineData(nameof(ObjectHelpers.NotEqual), "2000-01-01 0:00:00", "2000-01-01 0:00:00", false)]
50+
[InlineData(nameof(ObjectHelpers.NotEqual), "1999-01-01 0:00:00", "2000-01-01 0:00:00", true)]
51+
[InlineData(nameof(ObjectHelpers.NotEqual), "2000-01-01 0:00:00", "1999-01-01 0:00:00", true)]
52+
[InlineData(nameof(ObjectHelpers.GreaterThan), "2000-01-01 0:00:00", "2000-01-01 0:00:00", false)]
53+
[InlineData(nameof(ObjectHelpers.GreaterThan), "1999-01-01 0:00:00", "2000-01-01 0:00:00", false)]
54+
[InlineData(nameof(ObjectHelpers.GreaterThan), "2000-01-01 0:00:00", "1999-01-01 0:00:00", true)]
55+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "2000-01-01 0:00:00", "2000-01-01 0:00:00", true)]
56+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "1999-01-01 0:00:00", "2000-01-01 0:00:00", false)]
57+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "2000-01-01 0:00:00", "1999-01-01 0:00:00", true)]
58+
[InlineData(nameof(ObjectHelpers.LowerThan), "2000-01-01 0:00:00", "2000-01-01 0:00:00", false)]
59+
[InlineData(nameof(ObjectHelpers.LowerThan), "1999-01-01 0:00:00", "2000-01-01 0:00:00", true)]
60+
[InlineData(nameof(ObjectHelpers.LowerThan), "2000-01-01 0:00:00", "1999-01-01 0:00:00", false)]
61+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "2000-01-01 0:00:00", "2000-01-01 0:00:00", true)]
62+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "1999-01-01 0:00:00", "2000-01-01 0:00:00", true)]
63+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "2000-01-01 0:00:00", "1999-01-01 0:00:00", false)]
64+
public void All_Compare_Using_DateTime(string method, string value1, string value2, bool expected)
65+
{
66+
// Act
67+
var result = ActTestCompare(method, DateTime.Parse(value1), DateTime.Parse(value2));
68+
69+
// Assert
70+
result.Should().Be(expected);
71+
}
72+
73+
[Theory]
74+
[InlineData(nameof(ObjectHelpers.Equal), 0, 0, true)]
75+
[InlineData(nameof(ObjectHelpers.Equal), 1, 0, false)]
76+
[InlineData(nameof(ObjectHelpers.Equal), 0, 1, false)]
77+
[InlineData(nameof(ObjectHelpers.NotEqual), 0, 0, false)]
78+
[InlineData(nameof(ObjectHelpers.NotEqual), 1, 0, true)]
79+
[InlineData(nameof(ObjectHelpers.NotEqual), 0, 1, true)]
80+
[InlineData(nameof(ObjectHelpers.GreaterThan), 0, 0, false)]
81+
[InlineData(nameof(ObjectHelpers.GreaterThan), 1, 0, true)]
82+
[InlineData(nameof(ObjectHelpers.GreaterThan), 0, 1, false)]
83+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 0, 0, true)]
84+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 1, 0, true)]
85+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 0, 1, false)]
86+
[InlineData(nameof(ObjectHelpers.LowerThan), 0, 0, false)]
87+
[InlineData(nameof(ObjectHelpers.LowerThan), 1, 0, false)]
88+
[InlineData(nameof(ObjectHelpers.LowerThan), 0, 1, true)]
89+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 0, 0, true)]
90+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 1, 0, false)]
91+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 0, 1, true)]
92+
public void All_Compare_Using_Int(string method, object value1, object value2, bool expected)
93+
{
94+
// Act
95+
var result = ActTestCompare(method, value1, value2);
96+
97+
// Assert
98+
result.Should().Be(expected);
99+
}
100+
101+
[Theory]
102+
[InlineData(nameof(ObjectHelpers.Equal), 0, 0, true)]
103+
[InlineData(nameof(ObjectHelpers.Equal), 1, 0, false)]
104+
[InlineData(nameof(ObjectHelpers.Equal), 0, 1, false)]
105+
[InlineData(nameof(ObjectHelpers.NotEqual), 0, 0, false)]
106+
[InlineData(nameof(ObjectHelpers.NotEqual), 1, 0, true)]
107+
[InlineData(nameof(ObjectHelpers.NotEqual), 0, 1, true)]
108+
[InlineData(nameof(ObjectHelpers.GreaterThan), 0, 0, false)]
109+
[InlineData(nameof(ObjectHelpers.GreaterThan), 1, 0, true)]
110+
[InlineData(nameof(ObjectHelpers.GreaterThan), 0, 1, false)]
111+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 0, 0, true)]
112+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 1, 0, true)]
113+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), 0, 1, false)]
114+
[InlineData(nameof(ObjectHelpers.LowerThan), 0, 0, false)]
115+
[InlineData(nameof(ObjectHelpers.LowerThan), 1, 0, false)]
116+
[InlineData(nameof(ObjectHelpers.LowerThan), 0, 1, true)]
117+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 0, 0, true)]
118+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 1, 0, false)]
119+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), 0, 1, true)]
120+
public void All_Compare_Using_Custom_Object(string method, int value1, int value2, bool expected)
121+
{
122+
// Act
123+
var result = ActTestCompare(method, new CustomObject(value1), new CustomObject(value2));
124+
125+
// Assert
126+
result.Should().Be(expected);
127+
}
128+
129+
[Theory]
130+
[InlineData(nameof(ObjectHelpers.Equal), "a", "a", true)]
131+
[InlineData(nameof(ObjectHelpers.Equal), "a", "b", false)]
132+
[InlineData(nameof(ObjectHelpers.Equal), "b", "a", false)]
133+
[InlineData(nameof(ObjectHelpers.NotEqual), "a", "a", false)]
134+
[InlineData(nameof(ObjectHelpers.NotEqual), "a", "b", true)]
135+
[InlineData(nameof(ObjectHelpers.NotEqual), "b", "a", true)]
136+
[InlineData(nameof(ObjectHelpers.GreaterThan), "a", "a", false)]
137+
[InlineData(nameof(ObjectHelpers.GreaterThan), "a", "b", false)]
138+
[InlineData(nameof(ObjectHelpers.GreaterThan), "b", "a", true)]
139+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "a", "a", true)]
140+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "a", "b", false)]
141+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "b", "a", true)]
142+
[InlineData(nameof(ObjectHelpers.LowerThan), "a", "a", false)]
143+
[InlineData(nameof(ObjectHelpers.LowerThan), "a", "b", true)]
144+
[InlineData(nameof(ObjectHelpers.LowerThan), "b", "a", false)]
145+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "a", "a", true)]
146+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "a", "b", true)]
147+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "b", "a", false)]
148+
public void All_Compare_Using_String(string method, object value1, object value2, bool expected)
149+
{
150+
// Act
151+
var result = ActTestCompare(method, value1, value2);
152+
153+
// Assert
154+
result.Should().Be(expected);
155+
}
156+
157+
[Theory]
158+
[InlineData(nameof(ObjectHelpers.Equal), null, null, true)]
159+
[InlineData(nameof(ObjectHelpers.Equal), "a", null, false)]
160+
[InlineData(nameof(ObjectHelpers.Equal), null, "a", false)]
161+
[InlineData(nameof(ObjectHelpers.NotEqual), null, null, false)]
162+
[InlineData(nameof(ObjectHelpers.NotEqual), "a", null, true)]
163+
[InlineData(nameof(ObjectHelpers.NotEqual), null, "a", true)]
164+
[InlineData(nameof(ObjectHelpers.GreaterThan), null, null, false)]
165+
[InlineData(nameof(ObjectHelpers.GreaterThan), "a", null, false)]
166+
[InlineData(nameof(ObjectHelpers.GreaterThan), null, "a", false)]
167+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), null, null, true)]
168+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), "a", null, false)]
169+
[InlineData(nameof(ObjectHelpers.GreaterThanEqual), null, "a", false)]
170+
[InlineData(nameof(ObjectHelpers.LowerThan), null, null, false)]
171+
[InlineData(nameof(ObjectHelpers.LowerThan), "a", null, false)]
172+
[InlineData(nameof(ObjectHelpers.LowerThan), null, "a", false)]
173+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), null, null, true)]
174+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), "a", null, false)]
175+
[InlineData(nameof(ObjectHelpers.LowerThanEqual), null, "a", false)]
176+
public void All_Compare_Using_Null(string method, object value1, object value2, bool expected)
177+
{
178+
// Act
179+
var result = ActTestCompare(method, value1, value2);
180+
181+
// Assert
182+
result.Should().Be(expected);
183+
}
184+
185+
[Theory]
186+
[InlineData(0, 0, 0)]
187+
[InlineData(1, 0, 1)]
188+
[InlineData(0, 1, -1)]
189+
[InlineData(null, null, 0)]
190+
[InlineData(1, null, 0)]
191+
[InlineData(null, 1, 0)]
192+
public void CompareTo(object value1, object value2, int? expected)
193+
{
194+
// Act
195+
var result = _sut.CompareTo(value1, value2);
196+
197+
// Assert
198+
result.Should().Be(expected);
199+
}
200+
201+
[Fact]
202+
public void CompareTo_Using_Uncomparable_Obj()
203+
{
204+
Assert.Throws<ArgumentException>(() => _sut.CompareTo(new { }, new { }));
205+
}
206+
207+
// Aux Methods / Classes
208+
private bool ActTestCompare(string method, object value1, object value2)
209+
{
210+
return method switch
211+
{
212+
nameof(ObjectHelpers.Equal) => _sut.Equal(value1, value2),
213+
nameof(ObjectHelpers.NotEqual) => _sut.NotEqual(value1, value2),
214+
nameof(ObjectHelpers.GreaterThan) => _sut.GreaterThan(value1, value2),
215+
nameof (ObjectHelpers.GreaterThanEqual) => _sut.GreaterThanEqual(value1, value2),
216+
nameof (ObjectHelpers.LowerThan) => _sut.LowerThan(value1, value2),
217+
nameof (ObjectHelpers.LowerThanEqual) => _sut.LowerThanEqual(value1, value2),
218+
219+
_ => throw new ArgumentException("Invalid method name.")
220+
};
221+
}
222+
223+
private class CustomObject : IComparable
224+
{
225+
public CustomObject(int value)
226+
{
227+
Value = value;
228+
}
229+
230+
public int Value { get; set; }
231+
232+
public int CompareTo(object? other)
233+
{
234+
if (other is null || other is not CustomObject comparable)
235+
{
236+
return 0;
237+
}
238+
239+
return Value == comparable?.Value ? 0 : Value > comparable?.Value ? 1 : -1;
240+
}
241+
242+
public override bool Equals(object? obj)
243+
{
244+
return obj is CustomObject @object && Value == @object.Value;
245+
}
246+
}
42247
}

0 commit comments

Comments
 (0)