MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1// Test String.replace() and String.template() functionality
2
3console.log("=== String.replace() and String.template() Tests ===\n");
4
5// Test 1: Basic replace
6console.log("Test 1: Basic replace");
7let str1 = "hello world";
8console.log(" Original:", str1);
9console.log(" replace('world', 'there'):", str1.replace("world", "there"));
10console.log(" replace('hello', 'goodbye'):", str1.replace("hello", "goodbye"));
11console.log(" Original unchanged:", str1);
12
13// Test 2: Replace only first occurrence
14console.log("\nTest 2: Replace first occurrence only");
15let str2 = "the cat and the dog";
16console.log(" Original:", str2);
17console.log(" replace('the', 'a'):", str2.replace("the", "a"));
18let str3 = "hello hello hello";
19console.log(" '" + str3 + "'.replace('hello', 'hi'):", str3.replace("hello", "hi"));
20
21// Test 3: Replace not found
22console.log("\nTest 3: Replace when not found");
23let str4 = "JavaScript";
24console.log(" '" + str4 + "'.replace('Python', 'Ruby'):", str4.replace("Python", "Ruby"));
25console.log(" '" + str4 + "'.replace('java', 'JAVA'):", str4.replace("java", "JAVA"));
26
27// Test 4: Replace with empty string
28console.log("\nTest 4: Replace with empty string");
29let str5 = "remove this word";
30console.log(" '" + str5 + "'.replace('this ', ''):", str5.replace("this ", ""));
31let str6 = "prefixValue";
32console.log(" '" + str6 + "'.replace('prefix', ''):", str6.replace("prefix", ""));
33
34// Test 5: Replace single character
35console.log("\nTest 5: Replace single character");
36let str7 = "hello";
37console.log(" '" + str7 + "'.replace('l', 'L'):", str7.replace("l", "L"));
38console.log(" '" + str7 + "'.replace('h', 'H'):", str7.replace("h", "H"));
39console.log(" '" + str7 + "'.replace('o', 'O'):", str7.replace("o", "O"));
40
41// Test 6: Replace in paths and URLs
42console.log("\nTest 6: Replace in paths/URLs");
43let path = "/api/v1/users";
44console.log(" Path:", path);
45console.log(" replace('/api/', '/api/v2/'):", path.replace("/api/", "/api/v2/"));
46let url = "http://example.com";
47console.log(" URL:", url);
48console.log(" replace('http://', 'https://'):", url.replace("http://", "https://"));
49
50// Test 7: Basic template
51console.log("\nTest 7: Basic template()");
52let tpl1 = "Hello, {{name}}!";
53let data1 = { name: "Alice" };
54console.log(" Template:", tpl1);
55console.log(" Data: {name: 'Alice'}");
56console.log(" Result:", tpl1.template(data1));
57
58// Test 8: Multiple placeholders
59console.log("\nTest 8: Multiple placeholders");
60let tpl2 = "User {{name}} is {{age}} years old and lives in {{city}}";
61let data2 = { name: "Bob", age: 30, city: "NYC" };
62console.log(" Template:", tpl2);
63console.log(" Result:", tpl2.template(data2));
64
65// Test 9: Number and boolean values
66console.log("\nTest 9: Different value types");
67let tpl3 = "Status: {{active}}, Count: {{count}}, Rate: {{rate}}";
68let data3 = { active: true, count: 42, rate: 3.14 };
69console.log(" Template:", tpl3);
70console.log(" Result:", tpl3.template(data3));
71
72// Test 10: Missing keys
73console.log("\nTest 10: Missing keys in data");
74let tpl4 = "Hello {{first}} {{middle}} {{last}}";
75let data4 = { first: "John", last: "Doe" };
76console.log(" Template:", tpl4);
77console.log(" Data: {first: 'John', last: 'Doe'}");
78console.log(" Result:", tpl4.template(data4));
79console.log(" (missing {{middle}} becomes empty)");
80
81// Test 11: URL building
82console.log("\nTest 11: URL building");
83let urlTpl = "https://api.example.com/{{version}}/{{resource}}/{{id}}";
84let urlData = { version: "v2", resource: "users", id: 123 };
85console.log(" Template:", urlTpl);
86console.log(" Result:", urlTpl.template(urlData));
87
88// Test 12: Configuration
89console.log("\nTest 12: Configuration messages");
90let configTpl = "Server running on {{host}}:{{port}} in {{mode}} mode";
91let configData = { host: "localhost", port: 3000, mode: "development" };
92console.log(" Template:", configTpl);
93console.log(" Result:", configTpl.template(configData));
94
95// Test 13: Query template
96console.log("\nTest 13: Query template");
97let queryTpl = "SELECT * FROM {{table}} WHERE {{field}} = {{value}}";
98let queryData = { table: "users", field: "id", value: 42 };
99console.log(" Template:", queryTpl);
100console.log(" Result:", queryTpl.template(queryData));
101
102// Test 14: No placeholders
103console.log("\nTest 14: Template with no placeholders");
104let tpl6 = "This is just plain text";
105let data6 = { name: "unused" };
106console.log(" Template:", tpl6);
107console.log(" Result:", tpl6.template(data6));
108
109// Test 15: All placeholder
110console.log("\nTest 15: Template is all placeholder");
111let tpl7 = "{{value}}";
112let data7 = { value: "replaced" };
113console.log(" Template: '{{value}}'");
114console.log(" Result:", tpl7.template(data7));
115
116// Test 16: Combining replace and template
117console.log("\nTest 16: Combining replace() and template()");
118let message = "Hello {{USER}}, welcome!";
119console.log(" Original:", message);
120let normalized = message.replace("{{USER}}", "{{user}}");
121console.log(" After replace:", normalized);
122let final = normalized.template({ user: "Charlie" });
123console.log(" After template:", final);
124
125// Test 17: Replace after template
126console.log("\nTest 17: Replace after template");
127let greetTpl = "Hello, {{name}}!";
128let greetData = { name: "World" };
129let greeting = greetTpl.template(greetData);
130console.log(" After template:", greeting);
131let changed = greeting.replace("World", "Universe");
132console.log(" After replace:", changed);
133
134// Test 18: Validation messages
135console.log("\nTest 18: Validation messages");
136let errorTpl = "Field '{{field}}' must be at least {{min}} characters";
137let errorData = { field: "password", min: 8 };
138console.log(" Error template:", errorTpl);
139console.log(" Result:", errorTpl.template(errorData));
140
141let successTpl = "{{count}} items processed successfully";
142let successData = { count: 150 };
143console.log(" Success template:", successTpl);
144console.log(" Result:", successTpl.template(successData));
145
146// Test 19: Adjacent placeholders
147console.log("\nTest 19: Adjacent placeholders");
148let adjacent = "{{first}}{{second}}{{third}}";
149let adjData = { first: "A", second: "B", third: "C" };
150console.log(" Template:", adjacent);
151console.log(" Result:", adjacent.template(adjData));
152
153// Test 20: Whitespace in placeholder names
154console.log("\nTest 20: Whitespace in placeholder names");
155let wsTpl = "Hello {{userName}} from {{homeCity}}";
156let wsData = { userName: "Eve", homeCity: "Boston" };
157console.log(" Template:", wsTpl);
158console.log(" Result:", wsTpl.template(wsData));
159
160// Test 21: Edge cases - empty strings
161console.log("\nTest 21: Edge cases - empty strings");
162let empty = "";
163console.log(" Empty string replace('x', 'y'):", "'" + empty.replace("x", "y") + "'");
164console.log(" Empty string template({}):", "'" + empty.template({}) + "'");
165
166console.log("\n=== All tests completed ===");