library;
import self as self;
import "dart:core" as core;

static method test1(core::int value) → core::String {
  #L1:
  {
    final synthesized core::int #0#0 = value;
    {
      if(#0#0.{core::num::<}(#C1){(core::num) → core::bool}) {
        {
          return "case <2";
        }
      }
    }
    {
      if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
        {
          return "case 2";
        }
      }
    }
  }
  return "not matched";
}
static method test2(core::int value) → core::String {
  #L2:
  {
    final synthesized core::int #0#0 = value;
    {
      if(#0#0.{core::num::<}(#C1){(core::num) → core::bool}) {
        {
          return "case <2";
        }
      }
    }
    {
      if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0 || true) {
        {
          return "case 2";
        }
      }
    }
  }
  return "not matched";
}
static method test3(core::int value) → core::String {
  #L3:
  {
    final synthesized core::int #0#0 = value;
    {
      if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
        {
          return "case 2";
        }
      }
    }
    {
      if(#0#0.{core::num::<}(#C1){(core::num) → core::bool} || true) {
        {
          return "case <2";
        }
      }
    }
  }
  return "not matched";
}
static method test4(core::int value) → core::String {
  #L4:
  {
    final synthesized core::int #0#0 = value;
    {
      if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
        {
          return "case 2";
        }
      }
    }
    {
      if(#0#0.{core::num::<}(#C1){(core::num) → core::bool}) {
        {
          return "case <2";
        }
      }
    }
    {
      {
        {
          return "default";
        }
      }
    }
  }
}
static method test5(core::int value) → core::String {
  #L5:
  {
    final synthesized core::int #0#0 = value;
    {
      if(#C1 =={core::num::==}{(core::Object) → core::bool} #0#0) {
        {
          return "case 2";
        }
      }
    }
    {
      if(#0#0.{core::num::<}(#C1){(core::num) → core::bool} || #0#0.{core::num::>}(#C2){(core::num) → core::bool}) {
        {
          return "case <2 >3";
        }
      }
    }
    {
      {
        {
          return "default";
        }
      }
    }
  }
}
static method test6(core::int value) → core::String {
  #L6:
  switch(value) /* core::int */ {
    #L7:
    case #C1:
      {
        return "case 2";
      }
    #L8:
    case #C3:
    case #C4:
      {
        return "case 1/4";
      }
    #L9:
    default:
      {
        return "default";
      }
  }
}
static method main() → dynamic {
  self::expect("case <2", self::test1(1));
  self::expect("case 2", self::test1(2));
  self::expect("not matched", self::test1(3));
  self::expect("case <2", self::test2(1));
  self::expect("case 2", self::test2(2));
  self::expect("case 2", self::test2(3));
  self::expect("case <2", self::test3(1));
  self::expect("case 2", self::test3(2));
  self::expect("case <2", self::test3(3));
  self::expect("case <2", self::test4(1));
  self::expect("case 2", self::test4(2));
  self::expect("default", self::test4(3));
  self::expect("case <2", self::test4(1));
  self::expect("case 2", self::test4(2));
  self::expect("default", self::test4(3));
  self::expect("case <2 >3", self::test5(1));
  self::expect("case 2", self::test5(2));
  self::expect("default", self::test5(3));
  self::expect("case <2 >3", self::test5(4));
  self::expect("case 1/4", self::test6(1));
  self::expect("case 2", self::test6(2));
  self::expect("default", self::test6(3));
  self::expect("case 1/4", self::test6(4));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = 2
  #C2 = 3
  #C3 = 1
  #C4 = 4
}
