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 }); });