
namespace cruise.pooled.statemachine.test;


class PooledSM
{
  pooled status
  {
    Open {
      register -> Full;
    }
    Full {
      reject -> Full;
    }
  }
}

class LightFixture
{
  Integer brightness = 0;
  Integer dimmer;
  pooled bulb{
	Off{
	    turnDimmer(Integer lightval) /{setBrightness(lightval);} -> Off;
	    flipSwitch -> Dimmed;
	}
	Dimmed{
		entry[dimmer > 99] -> On;
		flipSwitch -> Off;
        turnDimmer(Integer lightval) /{setBrightness(lightval);} -> Dimmed;
	}
	On{
		flipSwitch -> Off;
        turnDimmer(Integer lightval) /{setBrightness(lightval);} -> Dimmed;
	}
  }
}

class Light
{
  pooled bulb
  {
    Off { -> On; }
    On { }
  }
}

class Mentor 
{

  int howLongUntilOk = 3;

  pooled status
  {
    Ok { after(2) -> NotOk; }
    NotOk {} 
  }
}

class X{
  pooled sm{
    s1 {
      ->s2;
    }
    s2{
      after(3) -> s3;
    }
    s3{
    }
  }
}

strictness ignore 62;
class PooledSMwithUnspecifiedReception{
  pooled sm{
    s1 {
      e1 -> s2;
      unspecified -> error1;
    }
    s2 {
    }
    error1 {
      -> s1;
    }
  }
}

class PooledSM_NestedState_L1 {
  pooled sm {
     s1 {
        e1 -> s2;
        e2 -> s2b;
     }
     s2 {
        e3 -> s1;
        s2a {
          e4 -> s2b;
        }
        s2b {
          e5 -> s2a;
        }
     }
  }
}

class PooledSM_NestedState_L1_1 {
  pooled sm {
     s1 {
        e1 -> s1a;
       s1a{
         e2 -> s1b;
       }
       s1b{
         e3 -> s2;
       }
     }
     s2 {
        e4 -> s1;
        s2a {
          e5 -> s2b;
        }
        s2b {
          e6 -> s2a;
        }
     }
  }
}

class PooledSM_NestedState_L1_2 {
  pooled sm {
     s1 {
        e1 -> s1a;
       s1a{
         e2 -> s1b;
       }
       s1b{
         e3 -> s2;
       }
     }
     s2 {
        e4 -> s1;
        s2a {
          e5 -> s2b;
        }
        s2b {
          e6 -> s3;
        }
     }
    
    s3 {
        e7 -> s2;
        s3a {
          e8 -> s3b;
        }
        s3b {
          e9 -> s1a;
        }
     }
  }
}

class PooledSM_NestedState_L2 {
  pooled sm1 {
    s1 {
      e -> s2;
      s1a {
        f -> s2b;
        g -> s1a;
      }
      s1b {
        h -> s1a;
        i -> s2b;
        k -> s2;
      }
    }
    s2 {
      e -> s1;
      s2a {
        i -> s2b;
        j -> s1b;
      }
      s2b {
        h -> s2a;
        k -> s1;
        s2b1 {
          m -> s2b2;
        }
        s2b2 {
          m -> s2b1;
        }
      }
    }
  }
}

class PooledSM_ConcurrentState
{
  pooled sm
  {
    s1
    {
      e1 -> s2;
    }
    s2
    {
      e2 -> s1;
      s2a
      {
        e3 -> s2b;
        e5 -> s1;
      }
      s2b
      {
        e3 -> s2a;
      }
      
      ||
      
      s2c
      {
        e4 -> s2d;  
      }
      
      s2d
      {
        e4 -> s2c;
      }     
      
    }
  
  }
}

class PooledSM_ConcurrentState_2
{
  pooled sm
  {
    s1
    {
      e1 -> s2;
    }
    s2
    {
      e2 -> s1;
      s2a
      {
        e3 -> s2b;
        e5 -> s1;
      }
      
      ||
      
      s2b
      {
        e4 -> s1;  
      }          
    }  
  }
}


class MultiplePooledSMs {
  pooled sm{
    s1{
      e1 -> s2;
    }
    s2{
      e2 ->s1;
    }
  }
  pooled sm1{
    s3{
      e2 -> s4;
    }
    s4{
      e4 -> s3;
    }
  }
}

class MultiplePooledSMs_sameEvents {
   pooled sm{
    s1 {
      ev1 ->s2;
      ev5 ->s3;
    }
    s2 {
      ev2 ->s3;
    }
    s3 {
      ev3 ->s4;
    }
    s4 {
      ev4 ->s1;
    }
  }
  pooled sm1 {
    s21 {
      ev1 -> s22;
    }
    s22 {
      ev7 -> s21;
    }
  }
 }
 
 class MultiplePooledSMs_nestedStates_EventlessSM{
  pooled sm{
    s1{
      e1 -> s1a;
      s1a{
        e5 -> s1b;
      }
      s1b{
        e6 -> s2;
      }
    }
    s2{
      e2 ->s1;
    }
  }
  pooled sm1{
    s3{
      e3 -> s4;
    }
    s4{
      e4 -> s3;
    }
  }
  sm2 {q{} s{}}
}


class PooledSM_timedTransition_1 {
  String log = "initial value";
  pooled sm {
    s0 {
      entry / {log = "running";}
      ev0 -> s1;
    }
    s1 {
      after(2) -> s2;
    }
    s2 {
      ev2 -> s3;
    }
    s3 {
      ev3 -> s4;
    }
    s4 {}
  }
}


class PooledSM_timedTransition_2 {
  String log = "initial value";
  pooled sm {
    s0 {
      entry / {log = "running";}
      ev0 -> s1;
    }
    s1 {
      after(2) -> s2;
      ev1 -> s3;
    }
    s2 {
      ev2 -> s4;
    }
    s3 {
      ev3 -> s4;
    }
    s4 {}
  }
}
