about summary refs log tree commit diff stats
path: root/js/baba-yaga/tests/logical_operators.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/baba-yaga/tests/logical_operators.test.js')
-rw-r--r--js/baba-yaga/tests/logical_operators.test.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/js/baba-yaga/tests/logical_operators.test.js b/js/baba-yaga/tests/logical_operators.test.js
new file mode 100644
index 0000000..ebb2efa
--- /dev/null
+++ b/js/baba-yaga/tests/logical_operators.test.js
@@ -0,0 +1,85 @@
+import { evaluate } from '../runner.js';
+
+describe('Logical Operators', () => {
+  test('!= (not equal) operator', () => {
+    const result = evaluate('1 != 2');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(true);
+    
+    const result2 = evaluate('1 != 1');
+    expect(result2.ok).toBe(true);
+    expect(result2.value).toBe(false);
+  });
+
+  test('and (logical and) operator', () => {
+    const result = evaluate('true and true');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(true);
+    
+    const result2 = evaluate('true and false');
+    expect(result2.ok).toBe(true);
+    expect(result2.value).toBe(false);
+    
+    const result3 = evaluate('false and true');
+    expect(result3.ok).toBe(true);
+    expect(result3.value).toBe(false);
+    
+    const result4 = evaluate('false and false');
+    expect(result4.ok).toBe(true);
+    expect(result4.value).toBe(false);
+  });
+
+  test('or (logical or) operator', () => {
+    const result = evaluate('true or true');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(true);
+    
+    const result2 = evaluate('true or false');
+    expect(result2.ok).toBe(true);
+    expect(result2.value).toBe(true);
+    
+    const result3 = evaluate('false or true');
+    expect(result3.ok).toBe(true);
+    expect(result3.value).toBe(true);
+    
+    const result4 = evaluate('false or false');
+    expect(result4.ok).toBe(true);
+    expect(result4.value).toBe(false);
+  });
+
+  test('xor operator', () => {
+    const result = evaluate('true xor true');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(false);
+    
+    const result2 = evaluate('true xor false');
+    expect(result2.ok).toBe(true);
+    expect(result2.value).toBe(true);
+    
+    const result3 = evaluate('false xor true');
+    expect(result3.ok).toBe(true);
+    expect(result3.value).toBe(true);
+    
+    const result4 = evaluate('false xor false');
+    expect(result4.ok).toBe(true);
+    expect(result4.value).toBe(false);
+  });
+
+  test('operator precedence', () => {
+    // and should have higher precedence than or
+    const result = evaluate('true or false and false');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(true); // true or (false and false) = true or false = true
+    
+    // Comparison should have higher precedence than logical
+    const result2 = evaluate('1 < 2 and 3 > 1');
+    expect(result2.ok).toBe(true);
+    expect(result2.value).toBe(true); // (1 < 2) and (3 > 1) = true and true = true
+  });
+
+  test('complex logical expressions', () => {
+    const result = evaluate('1 != 2 and 3 > 1 or false');
+    expect(result.ok).toBe(true);
+    expect(result.value).toBe(true); // (1 != 2 and 3 > 1) or false = (true and true) or false = true or false = true
+  });
+});