Coverage Summary for Class: Expr (dev.suresh)

Class Method, % Branch, % Line, % Instruction, %
Expr 100% (1/1) 60% (9/15) 70% (7/10) 65.2% (118/181)
Expr$Add 100% (1/1) 100% (1/1) 100% (19/19)
Expr$Const
Expr$Const$Double 100% (1/1) 100% (1/1) 100% (14/14)
Expr$Const$Int 100% (1/1) 100% (1/1) 100% (14/14)
Expr$Const$Long 100% (1/1) 100% (1/1) 100% (14/14)
Expr$Const$Str 0% (0/1) 0% (0/1) 0% (0/14)
Expr$Div 100% (1/1) 100% (1/1) 100% (19/19)
Expr$Mul 0% (0/1) 0% (0/1) 0% (0/19)
Expr$Neg 0% (0/1) 0% (0/1) 0% (0/14)
Total 66.7% (6/9) 60% (9/15) 66.7% (12/18) 64.3% (198/308)


 package dev.suresh;
 
 import org.jspecify.annotations.NullMarked;
 
 @NullMarked
 public sealed interface Expr {
     record Add(Expr left, Expr right) implements Expr {
     }
 
     record Mul(Expr left, Expr right) implements Expr {
     }
 
     record Div(Expr left, Expr right) implements Expr {
     }
 
     record Neg(Expr e) implements Expr {
     }
 
     sealed interface Const extends Expr {
         record Int(int i) implements Const {
         }
 
         record Double(double d) implements Const {
         }
 
         record Long(long l) implements Const {
         }
 
         record Str(String s) implements Const {
         }
     }
 
     static long eval(Expr expr) {
         return switch (expr) {
             case Expr.Add(var l, var r) -> eval(l) + eval(r);
             case Expr.Mul(var l, var r) -> eval(l) * eval(r);
             case Expr.Div(var l, var r) -> eval(l) / eval(r);
             case Expr.Neg(var e) -> -eval(e);
             case Expr.Const c -> switch (c) {
                 case Expr.Const.Int(var i) -> i;
                 case Expr.Const.Double(var d) -> (long) d;
                 case Expr.Const.Long(var l) -> l;
                 case Expr.Const.Str(var s) -> Long.parseLong(s);
             };
         };
     }
 }