diff --git a/evennia/commands/cmdset.py b/evennia/commands/cmdset.py index 996672213b..49a2875727 100644 --- a/evennia/commands/cmdset.py +++ b/evennia/commands/cmdset.py @@ -391,11 +391,11 @@ class CmdSet(with_metaclass(_CmdSetMeta, object)): cmdset_c = self._union(cmdset_a, self) # pass through options whenever they are set, unless the merging or higher-prio - # set changes the setting (i.e. has a non-None value). + # set changes the setting (i.e. has a non-None value). We don't pass through + # the duplicates setting; that is per-merge cmdset_c.no_channels = self.no_channels if cmdset_a.no_channels is None else cmdset_a.no_channels cmdset_c.no_exits = self.no_exits if cmdset_a.no_exits is None else cmdset_a.no_exits cmdset_c.no_objs = self.no_objs if cmdset_a.no_objs is None else cmdset_a.no_objs - cmdset_c.duplicates = self.duplicates if cmdset_a.duplicates is None else cmdset_a.duplicates else: # B higher priority than A @@ -415,11 +415,11 @@ class CmdSet(with_metaclass(_CmdSetMeta, object)): cmdset_c = self._union(self, cmdset_a) # pass through options whenever they are set, unless the higher-prio - # set changes the setting (i.e. has a non-None value). + # set changes the setting (i.e. has a non-None value). We don't pass through + # the duplicates setting; that is per-merge cmdset_c.no_channels = cmdset_a.no_channels if self.no_channels is None else self.no_channels cmdset_c.no_exits = cmdset_a.no_exits if self.no_exits is None else self.no_exits cmdset_c.no_objs = cmdset_a.no_objs if self.no_objs is None else self.no_objs - cmdset_c.duplicates = cmdset_a.duplicates if self.duplicates is None else self.duplicates # we store actual_mergetype since key_mergetypes # might be different from the main mergetype. diff --git a/evennia/commands/tests.py b/evennia/commands/tests.py index c238b7e3dd..d4ad6bc93a 100644 --- a/evennia/commands/tests.py +++ b/evennia/commands/tests.py @@ -186,7 +186,7 @@ class TestCmdSetMergers(TestCase): self.assertTrue(cmdset_f.no_exits) self.assertTrue(cmdset_f.no_objs) self.assertTrue(cmdset_f.no_channels) - self.assertTrue(cmdset_f.duplicates) + self.assertFalse(cmdset_f.duplicates) self.assertEqual(len(cmdset_f.commands), 4) a.priority = 2 b.priority = 1 @@ -198,7 +198,7 @@ class TestCmdSetMergers(TestCase): self.assertTrue(cmdset_f.no_channels) self.assertTrue(cmdset_f.duplicates) self.assertEqual(len(cmdset_f.commands), 4) - cmdset_f = a + b + c + d # forward, A top priority + cmdset_f = a + b + c + d # forward, A top priority. This never happens in practice. self.assertTrue(cmdset_f.no_exits) self.assertTrue(cmdset_f.no_objs) self.assertTrue(cmdset_f.no_channels) @@ -208,17 +208,17 @@ class TestCmdSetMergers(TestCase): b.priority = 0 c.priority = 1 d.priority = 2 - cmdset_f = d + c + b + a # reverse, A low prio + cmdset_f = d + c + b + a # reverse, A low prio. This never happens in practice. self.assertTrue(cmdset_f.no_exits) self.assertTrue(cmdset_f.no_objs) self.assertTrue(cmdset_f.no_channels) - self.assertTrue(cmdset_f.duplicates) + self.assertFalse(cmdset_f.duplicates) self.assertEqual(len(cmdset_f.commands), 4) cmdset_f = a + b + c + d # forward, A low prio self.assertTrue(cmdset_f.no_exits) self.assertTrue(cmdset_f.no_objs) self.assertTrue(cmdset_f.no_channels) - self.assertTrue(cmdset_f.duplicates) + self.assertFalse(cmdset_f.duplicates) self.assertEqual(len(cmdset_f.commands), 4) c.no_exits = False b.no_objs = False @@ -322,6 +322,18 @@ class TestGetAndMergeCmdSets(TwistedTestCase, EvenniaTest): deferred.addCallback(_callback) return deferred + def test_duplicates(self): + a, b, c, d = self.cmdset_a, self.cmdset_b, self.cmdset_c, self.cmdset_d + a.no_exits = True + a.no_channels = True + b.duplicates = True + d.duplicates = True + self.set_cmdsets(self.obj1, a, b, c, d) + deferred = cmdhandler.get_and_merge_cmdsets(self.obj1, None, None, self.obj1, "object") + def _callback(cmdset): + self.assertEqual(len(cmdset.commands), 9) + deferred.addCallback(_callback) + return deferred