diff --git a/src/test/java/org/codelibs/fess/script/example/ExampleEngineTest.java b/src/test/java/org/codelibs/fess/script/example/ExampleEngineTest.java index a68801c..2c101b3 100644 --- a/src/test/java/org/codelibs/fess/script/example/ExampleEngineTest.java +++ b/src/test/java/org/codelibs/fess/script/example/ExampleEngineTest.java @@ -178,4 +178,227 @@ public void test_evaluate_returnTypeConsistency() { assertTrue(result instanceof String); assertEquals("test", result); } + + // Additional comprehensive test cases for better coverage + + public void test_evaluate_withUnicodeCharacters() { + final Map params = new HashMap<>(); + // Test various Unicode characters including emojis + final String template = "Hello ๐ŸŒ World ๐Ÿš€ Test ๐Ÿ˜€"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withVariousEmojiSequences() { + final Map params = new HashMap<>(); + final String template = "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ๐Ÿ‘๐Ÿป ๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withMixedLanguages() { + final Map params = new HashMap<>(); + final String template = "English ๆ—ฅๆœฌ่ชž ไธญๆ–‡ ํ•œ๊ธ€ ุงู„ุนุฑุจูŠุฉ ะ ัƒััะบะธะน"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withSQLInjectionLikeStrings() { + final Map params = new HashMap<>(); + final String template = "'; DROP TABLE users; --"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withXSSLikeStrings() { + final Map params = new HashMap<>(); + final String template = ""; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withHTMLEntities() { + final Map params = new HashMap<>(); + final String template = "<div>&"'</div>"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withPathTraversalLikeStrings() { + final Map params = new HashMap<>(); + final String template = "../../etc/passwd"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withControlCharacters() { + final Map params = new HashMap<>(); + final String template = "Line1\r\nLine2\u0000Null\u0007Bell"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withVeryLongString() { + final Map params = new HashMap<>(); + final StringBuilder sb = new StringBuilder(); + // Create a string of 10MB + for (int i = 0; i < 10000; i++) { + sb.append("This is a very long string for testing memory handling. "); + } + final String template = sb.toString(); + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_consecutiveCalls() { + final Map params = new HashMap<>(); + // Test that consecutive calls don't affect each other + assertEquals("first", exampleEngine.evaluate("first", params)); + assertEquals("second", exampleEngine.evaluate("second", params)); + assertEquals("third", exampleEngine.evaluate("third", params)); + } + + public void test_evaluate_parameterMapImmutability() { + final Map params = new HashMap<>(); + params.put("key1", "value1"); + params.put("key2", "value2"); + + final String template = "test"; + final int originalSize = params.size(); + exampleEngine.evaluate(template, params); + + // Verify that the parameter map was not modified + assertEquals(originalSize, params.size()); + assertEquals("value1", params.get("key1")); + assertEquals("value2", params.get("key2")); + } + + public void test_evaluate_withNullValuesInParameterMap() { + final Map params = new HashMap<>(); + params.put("key1", null); + params.put("key2", "value"); + params.put("key3", null); + + final String template = "test with nulls"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withNestedMapsInParameters() { + final Map params = new HashMap<>(); + final Map nestedMap = new HashMap<>(); + nestedMap.put("nested1", "value1"); + nestedMap.put("nested2", 123); + params.put("outer", nestedMap); + + final String template = "nested test"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withListsInParameters() { + final Map params = new HashMap<>(); + final java.util.List list = new java.util.ArrayList<>(); + list.add("item1"); + list.add("item2"); + list.add("item3"); + params.put("list", list); + + final String template = "list test"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_templateImmutability() { + final Map params = new HashMap<>(); + final String originalTemplate = "original"; + final Object result = exampleEngine.evaluate(originalTemplate, params); + + // Verify that the returned value equals the original + assertEquals(originalTemplate, result); + // Verify that it's still a String + assertTrue(result instanceof String); + } + + public void test_evaluate_withRegexSpecialCharacters() { + final Map params = new HashMap<>(); + final String template = ".*+?^${}()|[]\\"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withJSONLikeString() { + final Map params = new HashMap<>(); + final String template = "{\"key\": \"value\", \"number\": 123, \"nested\": {\"inner\": true}}"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withXMLLikeString() { + final Map params = new HashMap<>(); + final String template = "text"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_getName_notNull() { + assertNotNull(exampleEngine.getName()); + } + + public void test_getName_notEmpty() { + assertFalse(exampleEngine.getName().isEmpty()); + } + + public void test_getName_exactValue() { + final String name = exampleEngine.getName(); + assertEquals("example", name); + assertEquals(7, name.length()); + } + + public void test_multipleInstancesWithDifferentTemplates() { + final ExampleEngine engine1 = new ExampleEngine(); + final ExampleEngine engine2 = new ExampleEngine(); + + final Map params1 = new HashMap<>(); + final Map params2 = new HashMap<>(); + + assertEquals("template1", engine1.evaluate("template1", params1)); + assertEquals("template2", engine2.evaluate("template2", params2)); + } + + public void test_evaluate_withBoundaryLengthStrings() { + final Map params = new HashMap<>(); + + // Test single character + assertEquals("a", exampleEngine.evaluate("a", params)); + + // Test two characters + assertEquals("ab", exampleEngine.evaluate("ab", params)); + + // Test exactly 255 characters + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 255; i++) { + sb.append("x"); + } + final String str255 = sb.toString(); + assertEquals(str255, exampleEngine.evaluate(str255, params)); + } + + public void test_evaluate_withBackslashCharacters() { + final Map params = new HashMap<>(); + final String template = "C:\\Users\\Test\\file.txt"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withQuotationMarks() { + final Map params = new HashMap<>(); + final String template = "He said \"Hello\" and she replied 'Hi'"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_stateIndependence() { + final Map params = new HashMap<>(); + // First call + exampleEngine.evaluate("first call", params); + // Second call should not be affected by the first + final Object result = exampleEngine.evaluate("second call", params); + assertEquals("second call", result); + } + + public void test_evaluate_withNumbersOnlyString() { + final Map params = new HashMap<>(); + final String template = "1234567890"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } + + public void test_evaluate_withMixedContent() { + final Map params = new HashMap<>(); + final String template = "Text123!@#$%^&*()_+-=[]{}|;':\",./<>?`~\n\t\r"; + assertEquals(template, exampleEngine.evaluate(template, params)); + } }