| @system unittest |
| { |
| import std.signals; |
| |
| import std.signals; |
| |
| int observedMessageCounter = 0; |
| |
| class Observer |
| { // our slot |
| void watch(string msg, int value) |
| { |
| switch (observedMessageCounter++) |
| { |
| case 0: |
| assert(msg == "setting new value"); |
| assert(value == 4); |
| break; |
| case 1: |
| assert(msg == "setting new value"); |
| assert(value == 6); |
| break; |
| default: |
| assert(0, "Unknown observation"); |
| } |
| } |
| } |
| |
| class Observer2 |
| { // our slot |
| void watch(string msg, int value) |
| { |
| } |
| } |
| |
| class Foo |
| { |
| int value() { return _value; } |
| |
| int value(int v) |
| { |
| if (v != _value) |
| { _value = v; |
| // call all the connected slots with the two parameters |
| emit("setting new value", v); |
| } |
| return v; |
| } |
| |
| // Mix in all the code we need to make Foo into a signal |
| mixin Signal!(string, int); |
| |
| private : |
| int _value; |
| } |
| |
| Foo a = new Foo; |
| Observer o = new Observer; |
| auto o2 = new Observer2; |
| auto o3 = new Observer2; |
| auto o4 = new Observer2; |
| auto o5 = new Observer2; |
| |
| a.value = 3; // should not call o.watch() |
| a.connect(&o.watch); // o.watch is the slot |
| a.connect(&o2.watch); |
| a.connect(&o3.watch); |
| a.connect(&o4.watch); |
| a.connect(&o5.watch); |
| a.value = 4; // should call o.watch() |
| a.disconnect(&o.watch); // o.watch is no longer a slot |
| a.disconnect(&o3.watch); |
| a.disconnect(&o5.watch); |
| a.disconnect(&o4.watch); |
| a.disconnect(&o2.watch); |
| a.value = 5; // so should not call o.watch() |
| a.connect(&o2.watch); |
| a.connect(&o.watch); // connect again |
| a.value = 6; // should call o.watch() |
| destroy(o); // destroying o should automatically disconnect it |
| a.value = 7; // should not call o.watch() |
| |
| assert(observedMessageCounter == 2); |
| } |
| |