diff options
-rw-r--r-- | behaviors/SwitchBehavior.py | 36 | ||||
-rw-r--r-- | tests/TestSwitchBehavior.py | 41 |
2 files changed, 77 insertions, 0 deletions
diff --git a/behaviors/SwitchBehavior.py b/behaviors/SwitchBehavior.py new file mode 100644 index 0000000..1377b42 --- /dev/null +++ b/behaviors/SwitchBehavior.py @@ -0,0 +1,36 @@ +from operationscore.Behavior import * +import util.ComponentRegistry as compReg +import json + +class SwitchBehavior(Behavior): + """ + SwitchBehavior is a behavior that transform into different behaviors base on the input data. + The behavior expects a JSON formatted argument 'PrefixToBehavior' that maps prefixes to behaviors. The behavior detects the prefix on the data and use the corresponding Behavior to process the data and return the outputs. + In Config file, include: + <PrefixToBehavior>JSON format dict with prefix keys and behavior ID values</PrefixToBehavior> + <DefaultBehavior>Default behavior's ID</DefaultBehavior> + An example config excerpt: + <Behavior> + <Class>behaviors.SwitchBehavior</Class> + <Args> + <Id>switch</Id> + <PrefixToBehavior>{'@':'game1', '#':'game2', '$':'game3'}</PrefixToBehavior> + <DefaultBehavior>game1</DefaultBehavior> + </Args> + </Behavior> + """ + def behaviorInit(self): + self.defaultBehavior = compReg.getComponent(self['DefaultBehavior']) + self.prefixDict = json.loads(self['PrefixToBehavior']) + self.currBehavior = None + self.setBehavior(self.defaultBehavior) + + def processResponse(self, sInputs, rInputs): + dataStr = sInputs[-1]['Data'] + if dataStr[0] in self.prefixDict: + self.setBehavior(compReg.getComponent(self.prefixDict[dataStr[0]])) + sInputs[-1]['Data'] = sInputs[-1]['Data'][1:] # remove prefix + return self.currBehavior.processResponse(sInputs, rInputs) + + def setBehavior(self, behavior): + self.currBehavior = behavior diff --git a/tests/TestSwitchBehavior.py b/tests/TestSwitchBehavior.py new file mode 100644 index 0000000..774dbbc --- /dev/null +++ b/tests/TestSwitchBehavior.py @@ -0,0 +1,41 @@ +import unittest +import util.ComponentRegistry as compReg + +from behaviors.SwitchBehavior import SwitchBehavior +from behaviors.EchoBehavior import EchoBehavior +from behaviors.DebugBehavior import DebugBehavior + +class TestSwitchBehavior(unittest.TestCase): + def setUp(self): + compReg.initRegistry() + + # add a test registry + self.behavior1 = EchoBehavior({'Id': 'behavior1'}) + self.behavior2 = DebugBehavior({'Id': 'behavior2'}) + compReg.registerComponent(self.behavior1) + compReg.registerComponent(self.behavior2) + + self.switchBehavior = SwitchBehavior({'Id': 'switch', 'PrefixToBehavior': '{"@": "behavior1", "#": "behavior2"}', 'DefaultBehavior': 'behavior1'}) + compReg.registerComponent(self.switchBehavior) + + def tearDown(self): + pass + + def test_switch_to_behavior1(self): + inputs = [{'Data': '@something', 'Location': 'someloc'}] + returned = self.switchBehavior.processResponse(inputs, []) + assert returned[0][0]['Location'] == 'someloc' + + def test_switch_to_behavior2(self): + inputs = [{'Data': '#something'}] + returned = self.switchBehavior.processResponse(inputs, []) + assert returned[0] == [] + + def test_default_behavior(self): + inputs = [{'Data': 'something', 'Location': 'someloc'}] + returned = self.switchBehavior.processResponse(inputs, []) + assert returned[0][0]['Location'] == 'someloc' + + +if __name__ == '__main__': + unittest.main() |