camelot-framework / yatomata

Yet another finite state machine implementation
26 stars 9 forks source link

When on = SomeEvent.class and to = SomeEvent.class wrong instance is injected to onSomeEvent(SomeEvent event) #12

Closed vania-pooh closed 9 years ago

vania-pooh commented 9 years ago

Consider the following test app:

import ru.yandex.qatools.fsm.Yatomata;
import ru.yandex.qatools.fsm.annotations.FSM;
import ru.yandex.qatools.fsm.annotations.OnTransit;
import ru.yandex.qatools.fsm.annotations.Transit;
import ru.yandex.qatools.fsm.annotations.Transitions;
import ru.yandex.qatools.fsm.impl.FSMBuilder;

public class TestFSM {

    public static void main(String[] args) {
        Yatomata<FSMClass> fsm = new FSMBuilder<>(FSMClass.class).build();
        ToEvent event = new ToEvent();
        event.setComment("I am event");
        fsm.fire(event);
    }

    @FSM(start = FromEvent.class)
    @Transitions(
            @Transit(from = FromEvent.class, on = ToEvent.class, to = ToEvent.class)
    )
    public static class FSMClass {

        @OnTransit
        public void onToEvent(ToEvent event) {
            System.out.println(event.getComment());
        }

    }

    public static class FromEvent {}

    public static class ToEvent {

        private String comment = "I am state";

        public String getComment() {
            return comment;
        }

        public void setComment(String comment) {
            this.comment = comment;
        }
    }   
}

According to docs if @OnTransit method has one argument then respective event should be injected. However right now next state instance is injected. So I expect that this code prints "I am event" but I'm getting "I am state".

vania-pooh commented 9 years ago

@smecsia I would say the problem is located somewhere in https://github.com/camelot-framework/yatomata/blob/master/src/main/java/ru/yandex/qatools/fsm/impl/BestMatchedAnnotatedMethodCaller.java#L76-L90

vania-pooh commented 9 years ago

@smecsia thanks a lot. :)