From a818c7f0595ddc35fd9218cbb2e69a4dc44a5cec Mon Sep 17 00:00:00 2001
From: rzvxa <rzvxa@protonmail.com>
Date: Fri, 8 Mar 2024 22:06:39 +0330
Subject: [PATCH] test(parser): add assignment operator to binarty operator
 tests.

---
 .../cases/pass/binary-operator-01/ast.snap    |  33 +++--
 .../cases/pass/binary-operator-01/case.fuse   |   2 +-
 .../cases/pass/binary-operator-01/tokens.snap |  48 +++++++-
 .../cases/pass/binary-operator-02/ast.snap    |  61 ++++++----
 .../cases/pass/binary-operator-02/case.fuse   |   2 +-
 .../cases/pass/binary-operator-02/tokens.snap |  60 ++++++++--
 .../cases/pass/binary-operator-03/ast.snap    |  63 ++++++----
 .../cases/pass/binary-operator-03/case.fuse   |   2 +-
 .../cases/pass/binary-operator-03/tokens.snap |  64 ++++++++--
 .../cases/pass/binary-operator-04/ast.snap    | 113 ++++++++++--------
 .../cases/pass/binary-operator-04/case.fuse   |   2 +-
 .../cases/pass/binary-operator-04/tokens.snap |  50 +++++++-
 .../cases/pass/binary-operator-05/ast.snap    | 111 +++++++++--------
 .../cases/pass/binary-operator-05/case.fuse   |   2 +-
 .../cases/pass/binary-operator-05/tokens.snap |  62 ++++++++--
 .../cases/pass/binary-operator-06/ast.snap    |  89 ++++++++------
 .../cases/pass/binary-operator-06/case.fuse   |   2 +-
 .../cases/pass/binary-operator-06/tokens.snap |  68 ++++++++---
 .../cases/pass/binary-operator-07/ast.snap    |  53 ++++----
 .../cases/pass/binary-operator-07/case.fuse   |   2 +-
 .../cases/pass/binary-operator-07/tokens.snap |  64 ++++++++--
 21 files changed, 655 insertions(+), 298 deletions(-)

diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-01/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-01/ast.snap
index ccdcd11..961f43e 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-01/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-01/ast.snap
@@ -1,34 +1,47 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b\n"
+description: "x = a and b\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 8,
+    end: 12,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: LogicalAnd(Span(
+        kind: Assignment(Span(
           start: 2,
-          end: 5,
+          end: 3,
         )),
         lhs: Identifier(Identifier(
           span: Span(
             start: 0,
             end: 1,
           ),
-          name: Atom("a"),
+          name: Atom("x"),
         )),
-        rhs: Identifier(Identifier(
-          span: Span(
+        rhs: BinaryOperator(BinaryOperator(
+          kind: LogicalAnd(Span(
             start: 6,
-            end: 7,
-          ),
-          name: Atom("b"),
+            end: 9,
+          )),
+          lhs: Identifier(Identifier(
+            span: Span(
+              start: 4,
+              end: 5,
+            ),
+            name: Atom("a"),
+          )),
+          rhs: Identifier(Identifier(
+            span: Span(
+              start: 10,
+              end: 11,
+            ),
+            name: Atom("b"),
+          )),
         )),
       ))),
     ],
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
index 1dc60c7..19057fe 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
@@ -1 +1 @@
-a and b
+x = a and b
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-01/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-01/tokens.snap
index e51b7ba..19f172a 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-01/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-01/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b\n"
+description: "x = a and b\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
 ---
@@ -28,9 +28,28 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
     token: Token(
       span: Span(
         start: 2,
+        end: 3,
+      ),
+      kind: Eq,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 3,
+          end: 4,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 4,
         end: 5,
       ),
-      kind: And,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -47,7 +66,26 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
     token: Token(
       span: Span(
         start: 6,
-        end: 7,
+        end: 9,
+      ),
+      kind: And,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 9,
+          end: 10,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 10,
+        end: 11,
       ),
       kind: Identifier,
     ),
@@ -55,8 +93,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-01/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 7,
-          end: 8,
+          start: 11,
+          end: 12,
         ),
         kind: Whitespace,
       ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-02/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-02/ast.snap
index 21e0d29..70571b5 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-02/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-02/ast.snap
@@ -1,48 +1,61 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b and c\n"
+description: "x = a and b and c\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 14,
+    end: 18,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: LogicalAnd(Span(
-          start: 8,
-          end: 11,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: BinaryOperator(BinaryOperator(
+        lhs: Identifier(Identifier(
+          span: Span(
+            start: 0,
+            end: 1,
+          ),
+          name: Atom("x"),
+        )),
+        rhs: BinaryOperator(BinaryOperator(
           kind: LogicalAnd(Span(
-            start: 2,
-            end: 5,
+            start: 12,
+            end: 15,
           )),
-          lhs: Identifier(Identifier(
-            span: Span(
-              start: 0,
-              end: 1,
-            ),
-            name: Atom("a"),
+          lhs: BinaryOperator(BinaryOperator(
+            kind: LogicalAnd(Span(
+              start: 6,
+              end: 9,
+            )),
+            lhs: Identifier(Identifier(
+              span: Span(
+                start: 4,
+                end: 5,
+              ),
+              name: Atom("a"),
+            )),
+            rhs: Identifier(Identifier(
+              span: Span(
+                start: 10,
+                end: 11,
+              ),
+              name: Atom("b"),
+            )),
           )),
           rhs: Identifier(Identifier(
             span: Span(
-              start: 6,
-              end: 7,
+              start: 16,
+              end: 17,
             ),
-            name: Atom("b"),
+            name: Atom("c"),
           )),
         )),
-        rhs: Identifier(Identifier(
-          span: Span(
-            start: 12,
-            end: 13,
-          ),
-          name: Atom("c"),
-        )),
       ))),
     ],
   ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
index b512cae..08a9d0a 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
@@ -1 +1 @@
-a and b and c
+x = a and b and c
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-02/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-02/tokens.snap
index 5787564..b1fa652 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-02/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-02/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b and c\n"
+description: "x = a and b and c\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
 ---
@@ -28,9 +28,28 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
     token: Token(
       span: Span(
         start: 2,
+        end: 3,
+      ),
+      kind: Eq,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 3,
+          end: 4,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 4,
         end: 5,
       ),
-      kind: And,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -47,16 +66,16 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
     token: Token(
       span: Span(
         start: 6,
-        end: 7,
+        end: 9,
       ),
-      kind: Identifier,
+      kind: And,
     ),
     leading_trivia: [],
     trailing_trivia: [
       Token(
         span: Span(
-          start: 7,
-          end: 8,
+          start: 9,
+          end: 10,
         ),
         kind: Whitespace,
       ),
@@ -65,10 +84,10 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 8,
+        start: 10,
         end: 11,
       ),
-      kind: And,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -85,7 +104,26 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
     token: Token(
       span: Span(
         start: 12,
-        end: 13,
+        end: 15,
+      ),
+      kind: And,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 15,
+          end: 16,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 16,
+        end: 17,
       ),
       kind: Identifier,
     ),
@@ -93,8 +131,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-02/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 13,
-          end: 14,
+          start: 17,
+          end: 18,
         ),
         kind: Whitespace,
       ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-03/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-03/ast.snap
index 1e279d8..7b9b849 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-03/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-03/ast.snap
@@ -1,48 +1,61 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b or c\n"
+description: "x = a and b or c\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 13,
+    end: 17,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: LogicalOr(Span(
-          start: 8,
-          end: 10,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: BinaryOperator(BinaryOperator(
-          kind: LogicalAnd(Span(
-            start: 2,
-            end: 5,
+        lhs: Identifier(Identifier(
+          span: Span(
+            start: 0,
+            end: 1,
+          ),
+          name: Atom("x"),
+        )),
+        rhs: BinaryOperator(BinaryOperator(
+          kind: LogicalOr(Span(
+            start: 12,
+            end: 14,
           )),
-          lhs: Identifier(Identifier(
-            span: Span(
-              start: 0,
-              end: 1,
-            ),
-            name: Atom("a"),
+          lhs: BinaryOperator(BinaryOperator(
+            kind: LogicalAnd(Span(
+              start: 6,
+              end: 9,
+            )),
+            lhs: Identifier(Identifier(
+              span: Span(
+                start: 4,
+                end: 5,
+              ),
+              name: Atom("a"),
+            )),
+            rhs: Identifier(Identifier(
+              span: Span(
+                start: 10,
+                end: 11,
+              ),
+              name: Atom("b"),
+            )),
           )),
           rhs: Identifier(Identifier(
             span: Span(
-              start: 6,
-              end: 7,
+              start: 15,
+              end: 16,
             ),
-            name: Atom("b"),
+            name: Atom("c"),
           )),
         )),
-        rhs: Identifier(Identifier(
-          span: Span(
-            start: 11,
-            end: 12,
-          ),
-          name: Atom("c"),
-        )),
       ))),
     ],
   ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
index 7750dc6..6bd64cd 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
@@ -1 +1 @@
-a and b or c
+x = a and b or c
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-03/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-03/tokens.snap
index e566d90..a9f3f3e 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-03/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-03/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "a and b or c\n"
+description: "x = a and b or c\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
 ---
@@ -28,9 +28,28 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
     token: Token(
       span: Span(
         start: 2,
+        end: 3,
+      ),
+      kind: Eq,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 3,
+          end: 4,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 4,
         end: 5,
       ),
-      kind: And,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -47,7 +66,26 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
     token: Token(
       span: Span(
         start: 6,
-        end: 7,
+        end: 9,
+      ),
+      kind: And,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 9,
+          end: 10,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 10,
+        end: 11,
       ),
       kind: Identifier,
     ),
@@ -55,8 +93,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 7,
-          end: 8,
+          start: 11,
+          end: 12,
         ),
         kind: Whitespace,
       ),
@@ -65,8 +103,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 8,
-        end: 10,
+        start: 12,
+        end: 14,
       ),
       kind: Or,
     ),
@@ -74,8 +112,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 10,
-          end: 11,
+          start: 14,
+          end: 15,
         ),
         kind: Whitespace,
       ),
@@ -84,8 +122,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 11,
-        end: 12,
+        start: 15,
+        end: 16,
       ),
       kind: Identifier,
     ),
@@ -93,8 +131,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-03/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 12,
-          end: 13,
+          start: 16,
+          end: 17,
         ),
         kind: Whitespace,
       ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-04/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-04/ast.snap
index b6696e2..a130e21 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-04/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-04/ast.snap
@@ -1,37 +1,35 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "1 + 2 * 3 - 4 / 5\n"
+description: "x = 1 + 2 * 3 - 4 / 5\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 18,
+    end: 22,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: Minus(Span(
-          start: 10,
-          end: 11,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: BinaryOperator(BinaryOperator(
-          kind: Plus(Span(
-            start: 2,
-            end: 3,
-          )),
-          lhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 0,
-              end: 1,
-            ),
-            raw: Atom("1"),
-            value: 1.0,
-            kind: Decimal,
+        lhs: Identifier(Identifier(
+          span: Span(
+            start: 0,
+            end: 1,
+          ),
+          name: Atom("x"),
+        )),
+        rhs: BinaryOperator(BinaryOperator(
+          kind: Minus(Span(
+            start: 14,
+            end: 15,
           )),
-          rhs: BinaryOperator(BinaryOperator(
-            kind: Multiply(Span(
+          lhs: BinaryOperator(BinaryOperator(
+            kind: Plus(Span(
               start: 6,
               end: 7,
             )),
@@ -40,45 +38,60 @@ Some(Chunk(
                 start: 4,
                 end: 5,
               ),
-              raw: Atom("2"),
-              value: 2.0,
+              raw: Atom("1"),
+              value: 1.0,
+              kind: Decimal,
+            )),
+            rhs: BinaryOperator(BinaryOperator(
+              kind: Multiply(Span(
+                start: 10,
+                end: 11,
+              )),
+              lhs: NumberLiteral(NumberLiteral(
+                span: Span(
+                  start: 8,
+                  end: 9,
+                ),
+                raw: Atom("2"),
+                value: 2.0,
+                kind: Decimal,
+              )),
+              rhs: NumberLiteral(NumberLiteral(
+                span: Span(
+                  start: 12,
+                  end: 13,
+                ),
+                raw: Atom("3"),
+                value: 3.0,
+                kind: Decimal,
+              )),
+            )),
+          )),
+          rhs: BinaryOperator(BinaryOperator(
+            kind: Division(Span(
+              start: 18,
+              end: 19,
+            )),
+            lhs: NumberLiteral(NumberLiteral(
+              span: Span(
+                start: 16,
+                end: 17,
+              ),
+              raw: Atom("4"),
+              value: 4.0,
               kind: Decimal,
             )),
             rhs: NumberLiteral(NumberLiteral(
               span: Span(
-                start: 8,
-                end: 9,
+                start: 20,
+                end: 21,
               ),
-              raw: Atom("3"),
-              value: 3.0,
+              raw: Atom("5"),
+              value: 5.0,
               kind: Decimal,
             )),
           )),
         )),
-        rhs: BinaryOperator(BinaryOperator(
-          kind: Division(Span(
-            start: 14,
-            end: 15,
-          )),
-          lhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 12,
-              end: 13,
-            ),
-            raw: Atom("4"),
-            value: 4.0,
-            kind: Decimal,
-          )),
-          rhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 16,
-              end: 17,
-            ),
-            raw: Atom("5"),
-            value: 5.0,
-            kind: Decimal,
-          )),
-        )),
       ))),
     ],
   ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
index ecf3b44..89846fb 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
@@ -1 +1 @@
-1 + 2 * 3 - 4 / 5
+x = 1 + 2 * 3 - 4 / 5
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-04/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-04/tokens.snap
index f5562be..9553289 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-04/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-04/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "1 + 2 * 3 - 4 / 5\n"
+description: "x = 1 + 2 * 3 - 4 / 5\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
 ---
@@ -11,7 +11,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
         start: 0,
         end: 1,
       ),
-      kind: NumberLiteral,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -30,7 +30,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
         start: 2,
         end: 3,
       ),
-      kind: Plus,
+      kind: Eq,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -68,7 +68,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
         start: 6,
         end: 7,
       ),
-      kind: Star,
+      kind: Plus,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -106,7 +106,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
         start: 10,
         end: 11,
       ),
-      kind: Minus,
+      kind: Star,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -144,7 +144,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
         start: 14,
         end: 15,
       ),
-      kind: Slash,
+      kind: Minus,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -176,4 +176,42 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-04/case.fuse
       ),
     ],
   ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 18,
+        end: 19,
+      ),
+      kind: Slash,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 19,
+          end: 20,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 20,
+        end: 21,
+      ),
+      kind: NumberLiteral,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 21,
+          end: 22,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
 ]
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-05/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-05/ast.snap
index 7315970..a763744 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-05/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-05/ast.snap
@@ -1,81 +1,94 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "1 + 2 < 3 + 4 // 5\n"
+description: "x = 1 + 2 < 3 + 4 // 5\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 19,
+    end: 23,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: LessThan(Span(
-          start: 6,
-          end: 7,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: BinaryOperator(BinaryOperator(
-          kind: Plus(Span(
-            start: 2,
-            end: 3,
-          )),
-          lhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 0,
-              end: 1,
-            ),
-            raw: Atom("1"),
-            value: 1.0,
-            kind: Decimal,
-          )),
-          rhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 4,
-              end: 5,
-            ),
-            raw: Atom("2"),
-            value: 2.0,
-            kind: Decimal,
-          )),
+        lhs: Identifier(Identifier(
+          span: Span(
+            start: 0,
+            end: 1,
+          ),
+          name: Atom("x"),
         )),
         rhs: BinaryOperator(BinaryOperator(
-          kind: Plus(Span(
+          kind: LessThan(Span(
             start: 10,
             end: 11,
           )),
-          lhs: NumberLiteral(NumberLiteral(
-            span: Span(
-              start: 8,
-              end: 9,
-            ),
-            raw: Atom("3"),
-            value: 3.0,
-            kind: Decimal,
+          lhs: BinaryOperator(BinaryOperator(
+            kind: Plus(Span(
+              start: 6,
+              end: 7,
+            )),
+            lhs: NumberLiteral(NumberLiteral(
+              span: Span(
+                start: 4,
+                end: 5,
+              ),
+              raw: Atom("1"),
+              value: 1.0,
+              kind: Decimal,
+            )),
+            rhs: NumberLiteral(NumberLiteral(
+              span: Span(
+                start: 8,
+                end: 9,
+              ),
+              raw: Atom("2"),
+              value: 2.0,
+              kind: Decimal,
+            )),
           )),
           rhs: BinaryOperator(BinaryOperator(
-            kind: FloorDivision(Span(
+            kind: Plus(Span(
               start: 14,
-              end: 16,
+              end: 15,
             )),
             lhs: NumberLiteral(NumberLiteral(
               span: Span(
                 start: 12,
                 end: 13,
               ),
-              raw: Atom("4"),
-              value: 4.0,
+              raw: Atom("3"),
+              value: 3.0,
               kind: Decimal,
             )),
-            rhs: NumberLiteral(NumberLiteral(
-              span: Span(
-                start: 17,
-                end: 18,
-              ),
-              raw: Atom("5"),
-              value: 5.0,
-              kind: Decimal,
+            rhs: BinaryOperator(BinaryOperator(
+              kind: FloorDivision(Span(
+                start: 18,
+                end: 20,
+              )),
+              lhs: NumberLiteral(NumberLiteral(
+                span: Span(
+                  start: 16,
+                  end: 17,
+                ),
+                raw: Atom("4"),
+                value: 4.0,
+                kind: Decimal,
+              )),
+              rhs: NumberLiteral(NumberLiteral(
+                span: Span(
+                  start: 21,
+                  end: 22,
+                ),
+                raw: Atom("5"),
+                value: 5.0,
+                kind: Decimal,
+              )),
             )),
           )),
         )),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
index 05569f7..185526a 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
@@ -1 +1 @@
-1 + 2 < 3 + 4 // 5
+x = 1 + 2 < 3 + 4 // 5
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-05/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-05/tokens.snap
index f6d3815..8db72ee 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-05/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-05/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "1 + 2 < 3 + 4 // 5\n"
+description: "x = 1 + 2 < 3 + 4 // 5\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
 ---
@@ -11,7 +11,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
         start: 0,
         end: 1,
       ),
-      kind: NumberLiteral,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -30,7 +30,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
         start: 2,
         end: 3,
       ),
-      kind: Plus,
+      kind: Eq,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -68,7 +68,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
         start: 6,
         end: 7,
       ),
-      kind: LAngle,
+      kind: Plus,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -106,7 +106,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
         start: 10,
         end: 11,
       ),
-      kind: Plus,
+      kind: LAngle,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -142,7 +142,45 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
     token: Token(
       span: Span(
         start: 14,
-        end: 16,
+        end: 15,
+      ),
+      kind: Plus,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 15,
+          end: 16,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 16,
+        end: 17,
+      ),
+      kind: NumberLiteral,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 17,
+          end: 18,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 18,
+        end: 20,
       ),
       kind: Slash2,
     ),
@@ -150,8 +188,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 16,
-          end: 17,
+          start: 20,
+          end: 21,
         ),
         kind: Whitespace,
       ),
@@ -160,8 +198,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 17,
-        end: 18,
+        start: 21,
+        end: 22,
       ),
       kind: NumberLiteral,
     ),
@@ -169,8 +207,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-05/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 18,
-          end: 19,
+          start: 22,
+          end: 23,
         ),
         kind: Whitespace,
       ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-06/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-06/ast.snap
index 7992038..6a8bacf 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-06/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-06/ast.snap
@@ -1,59 +1,72 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "x < max and x >= min\n"
+description: "x = x < max and x >= min\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 21,
+    end: 25,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: LogicalAnd(Span(
-          start: 8,
-          end: 11,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: BinaryOperator(BinaryOperator(
-          kind: LessThan(Span(
-            start: 2,
-            end: 3,
-          )),
-          lhs: Identifier(Identifier(
-            span: Span(
-              start: 0,
-              end: 1,
-            ),
-            name: Atom("x"),
-          )),
-          rhs: Identifier(Identifier(
-            span: Span(
-              start: 4,
-              end: 7,
-            ),
-            name: Atom("max"),
-          )),
+        lhs: Identifier(Identifier(
+          span: Span(
+            start: 0,
+            end: 1,
+          ),
+          name: Atom("x"),
         )),
         rhs: BinaryOperator(BinaryOperator(
-          kind: GreaterThanEqual(Span(
-            start: 14,
-            end: 16,
+          kind: LogicalAnd(Span(
+            start: 12,
+            end: 15,
           )),
-          lhs: Identifier(Identifier(
-            span: Span(
-              start: 12,
-              end: 13,
-            ),
-            name: Atom("x"),
+          lhs: BinaryOperator(BinaryOperator(
+            kind: LessThan(Span(
+              start: 6,
+              end: 7,
+            )),
+            lhs: Identifier(Identifier(
+              span: Span(
+                start: 4,
+                end: 5,
+              ),
+              name: Atom("x"),
+            )),
+            rhs: Identifier(Identifier(
+              span: Span(
+                start: 8,
+                end: 11,
+              ),
+              name: Atom("max"),
+            )),
           )),
-          rhs: Identifier(Identifier(
-            span: Span(
-              start: 17,
+          rhs: BinaryOperator(BinaryOperator(
+            kind: GreaterThanEqual(Span(
+              start: 18,
               end: 20,
-            ),
-            name: Atom("min"),
+            )),
+            lhs: Identifier(Identifier(
+              span: Span(
+                start: 16,
+                end: 17,
+              ),
+              name: Atom("x"),
+            )),
+            rhs: Identifier(Identifier(
+              span: Span(
+                start: 21,
+                end: 24,
+              ),
+              name: Atom("min"),
+            )),
           )),
         )),
       ))),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
index 016fb0c..7a1c807 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
@@ -1 +1 @@
-x < max and x >= min
+x = x < max and x >= min
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-06/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-06/tokens.snap
index 1b4bb2a..8b0750c 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-06/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-06/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "x < max and x >= min\n"
+description: "x = x < max and x >= min\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
 ---
@@ -30,7 +30,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
         start: 2,
         end: 3,
       ),
-      kind: LAngle,
+      kind: Eq,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -47,11 +47,30 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
     token: Token(
       span: Span(
         start: 4,
-        end: 7,
+        end: 5,
       ),
       kind: Identifier,
     ),
     leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 5,
+          end: 6,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 6,
+        end: 7,
+      ),
+      kind: LAngle,
+    ),
+    leading_trivia: [],
     trailing_trivia: [
       Token(
         span: Span(
@@ -68,7 +87,7 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
         start: 8,
         end: 11,
       ),
-      kind: And,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -85,16 +104,16 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
     token: Token(
       span: Span(
         start: 12,
-        end: 13,
+        end: 15,
       ),
-      kind: Identifier,
+      kind: And,
     ),
     leading_trivia: [],
     trailing_trivia: [
       Token(
         span: Span(
-          start: 13,
-          end: 14,
+          start: 15,
+          end: 16,
         ),
         kind: Whitespace,
       ),
@@ -103,17 +122,17 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 14,
-        end: 16,
+        start: 16,
+        end: 17,
       ),
-      kind: GtEq,
+      kind: Identifier,
     ),
     leading_trivia: [],
     trailing_trivia: [
       Token(
         span: Span(
-          start: 16,
-          end: 17,
+          start: 17,
+          end: 18,
         ),
         kind: Whitespace,
       ),
@@ -122,10 +141,10 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 17,
+        start: 18,
         end: 20,
       ),
-      kind: Identifier,
+      kind: GtEq,
     ),
     leading_trivia: [],
     trailing_trivia: [
@@ -138,4 +157,23 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-06/case.fuse
       ),
     ],
   ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 21,
+        end: 24,
+      ),
+      kind: Identifier,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 24,
+          end: 25,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
 ]
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-07/ast.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-07/ast.snap
index 0362b6c..b3db450 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-07/ast.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-07/ast.snap
@@ -1,43 +1,56 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "-x * 2\n"
+description: "x = -x * 2\n"
 expression: parsed.chunk
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
 ---
 Some(Chunk(
   span: Span(
     start: 0,
-    end: 7,
+    end: 11,
   ),
   body: Block(
     statements: [
       Expression(BinaryOperator(BinaryOperator(
-        kind: Multiply(Span(
-          start: 3,
-          end: 4,
+        kind: Assignment(Span(
+          start: 2,
+          end: 3,
         )),
-        lhs: UnaryOperator(UnaryOperator(
-          kind: Minus(Span(
+        lhs: Identifier(Identifier(
+          span: Span(
             start: 0,
             end: 1,
+          ),
+          name: Atom("x"),
+        )),
+        rhs: BinaryOperator(BinaryOperator(
+          kind: Multiply(Span(
+            start: 7,
+            end: 8,
+          )),
+          lhs: UnaryOperator(UnaryOperator(
+            kind: Minus(Span(
+              start: 4,
+              end: 5,
+            )),
+            expression: Identifier(Identifier(
+              span: Span(
+                start: 5,
+                end: 6,
+              ),
+              name: Atom("x"),
+            )),
           )),
-          expression: Identifier(Identifier(
+          rhs: NumberLiteral(NumberLiteral(
             span: Span(
-              start: 1,
-              end: 2,
+              start: 9,
+              end: 10,
             ),
-            name: Atom("x"),
+            raw: Atom("2"),
+            value: 2.0,
+            kind: Decimal,
           )),
         )),
-        rhs: NumberLiteral(NumberLiteral(
-          span: Span(
-            start: 5,
-            end: 6,
-          ),
-          raw: Atom("2"),
-          value: 2.0,
-          kind: Decimal,
-        )),
       ))),
     ],
   ),
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse b/crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
index 03d14f4..19cf417 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
@@ -1 +1 @@
--x * 2
+x = -x * 2
diff --git a/crates/fuse-parser/tests/cases/pass/binary-operator-07/tokens.snap b/crates/fuse-parser/tests/cases/pass/binary-operator-07/tokens.snap
index 9d89489..62032f7 100644
--- a/crates/fuse-parser/tests/cases/pass/binary-operator-07/tokens.snap
+++ b/crates/fuse-parser/tests/cases/pass/binary-operator-07/tokens.snap
@@ -1,6 +1,6 @@
 ---
 source: crates/fuse-parser/tests/cases/mod.rs
-description: "-x * 2\n"
+description: "x = -x * 2\n"
 expression: tokens
 input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
 ---
@@ -11,6 +11,44 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
         start: 0,
         end: 1,
       ),
+      kind: Identifier,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 1,
+          end: 2,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 2,
+        end: 3,
+      ),
+      kind: Eq,
+    ),
+    leading_trivia: [],
+    trailing_trivia: [
+      Token(
+        span: Span(
+          start: 3,
+          end: 4,
+        ),
+        kind: Whitespace,
+      ),
+    ],
+  ),
+  TokenReference(
+    token: Token(
+      span: Span(
+        start: 4,
+        end: 5,
+      ),
       kind: Minus,
     ),
     leading_trivia: [],
@@ -19,8 +57,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 1,
-        end: 2,
+        start: 5,
+        end: 6,
       ),
       kind: Identifier,
     ),
@@ -28,8 +66,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 2,
-          end: 3,
+          start: 6,
+          end: 7,
         ),
         kind: Whitespace,
       ),
@@ -38,8 +76,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 3,
-        end: 4,
+        start: 7,
+        end: 8,
       ),
       kind: Star,
     ),
@@ -47,8 +85,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 4,
-          end: 5,
+          start: 8,
+          end: 9,
         ),
         kind: Whitespace,
       ),
@@ -57,8 +95,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
   TokenReference(
     token: Token(
       span: Span(
-        start: 5,
-        end: 6,
+        start: 9,
+        end: 10,
       ),
       kind: NumberLiteral,
     ),
@@ -66,8 +104,8 @@ input_file: crates/fuse-parser/tests/cases/pass/binary-operator-07/case.fuse
     trailing_trivia: [
       Token(
         span: Span(
-          start: 6,
-          end: 7,
+          start: 10,
+          end: 11,
         ),
         kind: Whitespace,
       ),