From 6c8ef2f40b2ea24ef2812b8c11dd40424d198d8f Mon Sep 17 00:00:00 2001 From: Daniel McCoy Stephenson Date: Fri, 25 Sep 2026 03:32:36 -0600 Subject: [PATCH] Refuse an odd keyword count in createPairs Co-Authored-By: Claude Opus 5.5 --- src/ideaCollisionGenerator.py | 5 +++++ tests/test_ideaCollisionGenerator.py | 15 +++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ideaCollisionGenerator.py b/src/ideaCollisionGenerator.py index 6c98bcd..6357e8e 100644 --- a/src/ideaCollisionGenerator.py +++ b/src/ideaCollisionGenerator.py @@ -36,6 +36,11 @@ def getKeywords(self): random.shuffle(self.keywords) def createPairs(self): + # an odd keyword would be left without a partner, so it is refused + # the same way the constructor refuses an odd numKeywords + if len(self.keywords) % 2 != 0: + raise ValueError("keywords must have an even count to be paired, got " + str(len(self.keywords))) + # match keywords in pairs for i in range(0, len(self.keywords), 2): pair = [] diff --git a/tests/test_ideaCollisionGenerator.py b/tests/test_ideaCollisionGenerator.py index 22ada0f..c1eed0f 100644 --- a/tests/test_ideaCollisionGenerator.py +++ b/tests/test_ideaCollisionGenerator.py @@ -120,14 +120,21 @@ def testNoKeywordsProduceNoPairs(self): generator.createPairs() self.assertEqual(generator.pairs, []) - def testOddKeywordCountRaisesIndexError(self): - # current behaviour: keywords[i+1] is unguarded, so the final iteration - # indexes past the end (unreachable through the CLI, where the count is 10) + def testOddKeywordCountRaisesValueError(self): + # a trailing keyword with no partner is refused rather than indexed past generator = IdeaCollisionGenerator() generator.keywords = ["a", "b", "c"] - with self.assertRaises(IndexError): + with self.assertRaisesRegex(ValueError, "even count"): generator.createPairs() + def testOddKeywordCountCreatesNoPairs(self): + # the count is checked before any pair is made, so nothing half-built is left behind + generator = IdeaCollisionGenerator() + generator.keywords = ["a", "b", "c"] + with self.assertRaises(ValueError): + generator.createPairs() + self.assertEqual(generator.pairs, []) + class TestPromptForIdeas(unittest.TestCase): def testCollectsOneIdeaPerPair(self):