@Test
  public void mixing_static_and_dynamic_operators_produce_redundance() {
    CCSProcess process = makeProcessWithMixtureOfOperators();

    Assert.assertThat(process.toString(), is("(recX:(a!.tau.X))\\{b}"));

    Assert.assertThat(process.getNextStates().size(), is(1));

    CCSProcessState firststate = process.getNextStates().get(0);
    Assert.assertThat(firststate.getAction().toString(), is("a!"));
    Assert.assertThat(firststate.getProcess().toString(), is("(recX:(a!.tau.X))\\{b}"));

    // first recursion...
    Assert.assertThat(firststate.getNextStates().size(), is(1));
    firststate = process.getNextStates().get(0);
    Assert.assertThat(firststate.getAction().toString(), is("a!"));
    Assert.assertThat(firststate.getProcess().toString(), is("(recX:(a!.tau.X))\\{b}"));

    // ...second recursion...
    Assert.assertThat(firststate.getNextStates().size(), is(1));
    firststate = process.getNextStates().get(0);
    Assert.assertThat(firststate.getAction().toString(), is("a!"));
    Assert.assertThat(firststate.getProcess().toString(), is("(recX:(a!.tau.X))\\{b}"));
    Assert.assertThat(firststate.getNextStates().size(), is(1));

    // and the story repeat...

  }
  @Test
  public void check_next_states_with_two_complementary_action_prefixed_processes() {
    CCSProcess process = makeProcessUnderTest();

    Assert.assertThat(process.getNextStates().size(), is(3));

    CCSProcessState firststate = process.getNextStates().get(0);
    Assert.assertThat(firststate.getAction().toString(), is("a!"));
    Assert.assertThat(firststate.getProcess().toString(), is("tau"));
    Assert.assertThat(firststate.getNextStates().size(), is(0));

    CCSProcessState secondState = process.getNextStates().get(1);
    Assert.assertThat(secondState.getAction().toString(), is("b?"));
    Assert.assertThat(secondState.getProcess().toString(), is("(tau | c?.tau).X"));
    Assert.assertThat(secondState.getNextStates().size(), is(1));
    secondState = secondState.getNextStates().get(0);
    Assert.assertThat(secondState.getAction().toString(), is("c?"));
    Assert.assertThat(
        secondState.getProcess().toString(), is("recX:((a!.tau + (b?.tau | c?.tau).X))"));
    Assert.assertThat(secondState.getNextStates().size(), is(3));

    // first recursion...
    secondState = process.getNextStates().get(1);
    Assert.assertThat(secondState.getAction().toString(), is("b?"));
    Assert.assertThat(secondState.getProcess().toString(), is("(tau | c?.tau).X"));
    Assert.assertThat(secondState.getNextStates().size(), is(1));
    secondState = secondState.getNextStates().get(0);
    Assert.assertThat(secondState.getAction().toString(), is("c?"));
    Assert.assertThat(
        secondState.getProcess().toString(), is("recX:((a!.tau + (b?.tau | c?.tau).X))"));
    Assert.assertThat(secondState.getNextStates().size(), is(3));

    // ...second recursion...
    secondState = process.getNextStates().get(1);
    Assert.assertThat(secondState.getAction().toString(), is("b?"));
    Assert.assertThat(secondState.getProcess().toString(), is("(tau | c?.tau).X"));
    Assert.assertThat(secondState.getNextStates().size(), is(1));
    secondState = secondState.getNextStates().get(0);
    Assert.assertThat(secondState.getAction().toString(), is("c?"));
    Assert.assertThat(
        secondState.getProcess().toString(), is("recX:((a!.tau + (b?.tau | c?.tau).X))"));
    Assert.assertThat(secondState.getNextStates().size(), is(3));

    // ...and the story repeat...

  }
  @Test
  public void test() {
    CCSProcess recProcess = makeProcessUnderTest();

    Assert.assertThat(recProcess.toString(), is("recX:((a!.tau + (b?.tau | c?.tau).X))"));
  }