Skip to content

Commit 73e3df6

Browse files
committed
Added test class and fixed issue.
1 parent f166df2 commit 73e3df6

File tree

2 files changed

+106
-0
lines changed
  • src
    • main/java/world/bentobox/challenges/database/object/requirements
    • test/java/world/bentobox/challenges/database/object/requirements

2 files changed

+106
-0
lines changed

src/main/java/world/bentobox/challenges/database/object/requirements/CheckPapi.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ public boolean parseCondition() {
183183
String leftOperand = leftSB.toString().trim();
184184
String rightOperand = rightSB.toString().trim();
185185

186+
if (rightOperand.isEmpty()) {
187+
return false;
188+
}
189+
186190
// Evaluate the condition:
187191
// If both operands can be parsed as numbers, use numeric comparison;
188192
// otherwise, perform string comparison.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package world.bentobox.challenges.database.object.requirements;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
import static org.mockito.ArgumentMatchers.anyString;
6+
import static org.mockito.ArgumentMatchers.eq;
7+
import static org.mockito.Mockito.when;
8+
9+
import org.bukkit.entity.Player;
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
import org.junit.runner.RunWith;
13+
import org.mockito.Mock;
14+
import org.mockito.Mockito;
15+
import org.mockito.stubbing.Answer;
16+
import org.powermock.api.mockito.PowerMockito;
17+
import org.powermock.core.classloader.annotations.PrepareForTest;
18+
import org.powermock.modules.junit4.PowerMockRunner;
19+
20+
import me.clip.placeholderapi.PlaceholderAPI;
21+
22+
@RunWith(PowerMockRunner.class)
23+
@PrepareForTest(PlaceholderAPI.class)
24+
public class CheckPapiTest {
25+
26+
@Mock
27+
private Player player;
28+
29+
@Before
30+
public void setUp() {
31+
PowerMockito.mockStatic(PlaceholderAPI.class, Mockito.RETURNS_MOCKS);
32+
// Return back the input string
33+
when(PlaceholderAPI.setPlaceholders(eq(player), anyString()))
34+
.thenAnswer((Answer<String>) invocation -> invocation.getArgument(1, String.class));
35+
}
36+
37+
@Test
38+
public void testNumericEquality() {
39+
// Using numeric equality comparisons.
40+
assertTrue(CheckPapi.evaluate(player, "40 == 40"));
41+
assertFalse(CheckPapi.evaluate(player, "40 == 50"));
42+
assertTrue(CheckPapi.evaluate(player, "100 = 100"));
43+
assertFalse(CheckPapi.evaluate(player, "100 = 101"));
44+
}
45+
46+
@Test
47+
public void testNumericComparison() {
48+
assertTrue(CheckPapi.evaluate(player, "40 > 20"));
49+
assertFalse(CheckPapi.evaluate(player, "20 > 40"));
50+
assertTrue(CheckPapi.evaluate(player, "20 < 40"));
51+
assertFalse(CheckPapi.evaluate(player, "40 < 20"));
52+
assertTrue(CheckPapi.evaluate(player, "30 <= 30"));
53+
assertFalse(CheckPapi.evaluate(player, "31 <= 30"));
54+
assertTrue(CheckPapi.evaluate(player, "30 >= 30"));
55+
assertFalse(CheckPapi.evaluate(player, "29 >= 30"));
56+
// Extra tokens beyond a valid expression.
57+
assertTrue(CheckPapi.evaluate(player, "40 > 20 extra"));
58+
59+
}
60+
61+
@Test
62+
public void testStringEquality() {
63+
// String comparisons with multi-word operands.
64+
assertTrue(CheckPapi.evaluate(player, "john smith == john smith"));
65+
assertFalse(CheckPapi.evaluate(player, "john smith == jane doe"));
66+
// Using inequality operators.
67+
assertTrue(CheckPapi.evaluate(player, "john smith <> jane doe"));
68+
assertFalse(CheckPapi.evaluate(player, "john smith <> john smith"));
69+
}
70+
71+
@Test
72+
public void testStringLexicographicalComparison() {
73+
// Lexicographical comparison using string compareTo semantics.
74+
assertTrue(CheckPapi.evaluate(player, "apple < banana"));
75+
assertTrue(CheckPapi.evaluate(player, "banana > apple"));
76+
assertTrue(CheckPapi.evaluate(player, "cat >= cat"));
77+
assertTrue(CheckPapi.evaluate(player, "cat <= cat"));
78+
}
79+
80+
@Test
81+
public void testMultipleConditionsAndOr() {
82+
// AND has higher precedence than OR.
83+
// "john smith == john smith AND 40 > 20" should be true.
84+
assertTrue(CheckPapi.evaluate(player, "john smith == john smith AND 40 > 20"));
85+
// "john smith == jane doe OR 40 > 20" should be true because second condition is true.
86+
assertTrue(CheckPapi.evaluate(player, "john smith == jane doe OR 40 > 20"));
87+
// "john smith == jane doe AND 40 > 20" should be false because first condition fails.
88+
assertFalse(CheckPapi.evaluate(player, "john smith == jane doe AND 40 > 20"));
89+
// Mixed AND and OR: AND is evaluated first.
90+
// Equivalent to: (john smith == jane doe) OR ((40 > 20) AND (10 < 20))
91+
assertTrue(CheckPapi.evaluate(player, "john smith == jane doe OR 40 > 20 AND 10 < 20"));
92+
}
93+
94+
@Test
95+
public void testInvalidFormula() {
96+
// Missing operator between operands.
97+
assertFalse(CheckPapi.evaluate(player, "40 40"));
98+
// Incomplete condition.
99+
assertFalse(CheckPapi.evaluate(player, "40 >"));
100+
}
101+
102+
}

0 commit comments

Comments
 (0)