-
Notifications
You must be signed in to change notification settings - Fork 21.1k
Expand file tree
/
Copy pathRegularExpressionMatchingTest.java
More file actions
151 lines (131 loc) · 6.29 KB
/
RegularExpressionMatchingTest.java
File metadata and controls
151 lines (131 loc) · 6.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.thealgorithms.dynamicprogramming;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
/**
* Unit tests for RegularExpressionMatching algorithm
*
* Covers various test cases including:
* - Basic matching scenarios
* - '.' wildcard functionality
* - '*' quantifier functionality
* - Edge cases and boundary conditions
* - Invalid input validation
*
* @author Your Name (replace with your GitHub username)
*/
public class RegularExpressionMatchingTest {
@Test
void testBasicMatching() {
// Exact matches
assertTrue(RegularExpressionMatching.isMatch("abc", "abc"));
assertFalse(RegularExpressionMatching.isMatch("abc", "abcd"));
assertFalse(RegularExpressionMatching.isMatch("abcd", "abc"));
}
@Test
void testDotWildcard() {
// '.' should match any single character
assertTrue(RegularExpressionMatching.isMatch("abc", "a.c"));
assertTrue(RegularExpressionMatching.isMatch("axc", "a.c"));
assertFalse(RegularExpressionMatching.isMatch("abc", "a.."));
assertTrue(RegularExpressionMatching.isMatch("abc", "..."));
assertFalse(RegularExpressionMatching.isMatch("ab", "..."));
}
@Test
void testStarQuantifier() {
// '*' means zero or more of preceding element
assertTrue(RegularExpressionMatching.isMatch("aa", "a*"));
assertTrue(RegularExpressionMatching.isMatch("aaa", "a*"));
assertTrue(RegularExpressionMatching.isMatch("", "a*"));
assertFalse(RegularExpressionMatching.isMatch("b", "a*"));
// Complex star patterns
assertTrue(RegularExpressionMatching.isMatch("aab", "c*a*b"));
assertTrue(RegularExpressionMatching.isMatch("b", "c*a*b"));
}
@Test
void testDotStarCombination() {
// ".*" should match any sequence of characters
assertTrue(RegularExpressionMatching.isMatch("abc", ".*"));
assertTrue(RegularExpressionMatching.isMatch("xyz", ".*"));
assertTrue(RegularExpressionMatching.isMatch("", ".*"));
assertTrue(RegularExpressionMatching.isMatch("abc123", ".*"));
// More complex combinations
assertTrue(RegularExpressionMatching.isMatch("abc", "a.*c"));
assertTrue(RegularExpressionMatching.isMatch("axxxc", "a.*c"));
assertFalse(RegularExpressionMatching.isMatch("abc", "a.*d"));
}
@Test
void testComplexPatterns() {
// Mixed patterns
assertTrue(RegularExpressionMatching.isMatch("mississippi", "mis*is*ip*."));
assertTrue(RegularExpressionMatching.isMatch("mississippi", "mis*is*p*."));
assertFalse(RegularExpressionMatching.isMatch("mississippi", "mis*is*ip*.."));
// Multiple star operators
assertTrue(RegularExpressionMatching.isMatch("a", "a*a*a*"));
assertTrue(RegularExpressionMatching.isMatch("aaa", "a*a*a*"));
assertTrue(RegularExpressionMatching.isMatch("", "a*b*c*"));
}
@Test
void testEdgeCases() {
// Empty strings
assertTrue(RegularExpressionMatching.isMatch("", ""));
assertTrue(RegularExpressionMatching.isMatch("", "a*"));
assertTrue(RegularExpressionMatching.isMatch("", ".*"));
assertFalse(RegularExpressionMatching.isMatch("", "a"));
assertFalse(RegularExpressionMatching.isMatch("", "."));
// Single character patterns
assertTrue(RegularExpressionMatching.isMatch("a", "a"));
assertTrue(RegularExpressionMatching.isMatch("a", "."));
assertFalse(RegularExpressionMatching.isMatch("a", "b"));
assertFalse(RegularExpressionMatching.isMatch("a", "aa"));
}
@Test
void testInvalidInputs() {
// Null inputs
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch(null, "pattern"));
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch("string", null));
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch(null, null));
// Invalid patterns
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch("test", "*abc"));
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch("test", "a**b"));
assertThrows(IllegalArgumentException.class,
() -> RegularExpressionMatching.isMatch("test", "abc@"));
}
@Test
void testIterativeImplementation() {
// Test that iterative implementation produces same results as recursive
assertTrue(RegularExpressionMatching.isMatchIterative("aa", "a*"));
assertTrue(RegularExpressionMatching.isMatchIterative("ab", ".*"));
assertFalse(RegularExpressionMatching.isMatchIterative("aa", "a"));
assertTrue(RegularExpressionMatching.isMatchIterative("aab", "c*a*b"));
// Test with same inputs for both implementations
String[] testStrings = {"", "a", "aa", "ab", "aaa", "aab", "mississippi"};
String[] testPatterns = {"", "a", "a*", ".*", "a.b", "c*a*b", "mis*is*p*."};
for (String s : testStrings) {
for (String p : testPatterns) {
if (!p.isEmpty() && p.charAt(0) != '*') { // Skip invalid patterns
boolean recursiveResult = RegularExpressionMatching.isMatch(s, p);
boolean iterativeResult = RegularExpressionMatching.isMatchIterative(s, p);
assertTrue(recursiveResult == iterativeResult,
String.format("Mismatch for s='%s', p='%s'", s, p));
}
}
}
}
@Test
void testLeetCodeExamples() {
// Examples from LeetCode problem description
assertFalse(RegularExpressionMatching.isMatch("aa", "a"));
assertTrue(RegularExpressionMatching.isMatch("aa", "a*"));
assertTrue(RegularExpressionMatching.isMatch("ab", ".*"));
// Additional LeetCode test cases
assertTrue(RegularExpressionMatching.isMatch("aab", "c*a*b"));
assertFalse(RegularExpressionMatching.isMatch("mississippi", "mis*is*p*."));
}
}