about summary refs log tree commit diff stats
path: root/js/baba-yaga/tests/logical_operators.test.js
blob: ebb2efa4aef31ca76c08d6f8e7cd211275ddeb56 (plain) (blame)
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
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
  });
});