diff --git a/__init__.py b/__init__.py index 311db7f..ce60517 100644 --- a/__init__.py +++ b/__init__.py @@ -10,13 +10,16 @@ from .number_range_index import NODE_CLASS_MAPPINGS as RANGE_NODE_CLASS_MAPPINGS from .number_range_index import NODE_DISPLAY_NAME_MAPPINGS as RANGE_NODE_DISPLAY_NAME_MAPPINGS from .string_concatenator import NODE_CLASS_MAPPINGS as CONCAT_NODE_CLASS_MAPPINGS from .string_concatenator import NODE_DISPLAY_NAME_MAPPINGS as CONCAT_NODE_DISPLAY_NAME_MAPPINGS +from .number_sequence_generator import NODE_CLASS_MAPPINGS as SEQUENCE_NODE_CLASS_MAPPINGS +from .number_sequence_generator import NODE_DISPLAY_NAME_MAPPINGS as SEQUENCE_NODE_DISPLAY_NAME_MAPPINGS NODE_CLASS_MAPPINGS = { **SWITCH_NODE_CLASS_MAPPINGS, **CONDITION_NODE_CLASS_MAPPINGS, **BOOLEAN_NODE_CLASS_MAPPINGS, **RANGE_NODE_CLASS_MAPPINGS, - **CONCAT_NODE_CLASS_MAPPINGS + **CONCAT_NODE_CLASS_MAPPINGS, + **SEQUENCE_NODE_CLASS_MAPPINGS } NODE_DISPLAY_NAME_MAPPINGS = { @@ -24,7 +27,8 @@ NODE_DISPLAY_NAME_MAPPINGS = { **CONDITION_NODE_DISPLAY_NAME_MAPPINGS, **BOOLEAN_NODE_DISPLAY_NAME_MAPPINGS, **RANGE_NODE_DISPLAY_NAME_MAPPINGS, - **CONCAT_NODE_DISPLAY_NAME_MAPPINGS + **CONCAT_NODE_DISPLAY_NAME_MAPPINGS, + **SEQUENCE_NODE_DISPLAY_NAME_MAPPINGS } __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/number_sequence_generator.py b/number_sequence_generator.py new file mode 100644 index 0000000..333b39b --- /dev/null +++ b/number_sequence_generator.py @@ -0,0 +1,72 @@ +class NumberSequenceGenerator: + """ + Number Sequence Generator Node: Generates a sequence of numbers with specified repetitions. + + This node generates a sequence of numbers within a specified range (start_number to end_number), + repeating each number a specified number of times before moving to the next number. + + Each time the node is executed, it outputs the next number in the sequence. When the sequence + is complete (after outputting the end_number the specified number of times), it starts over + from the beginning. + + Usage examples: + - With start_number=1, end_number=3, repeat_count=2: + Outputs 1,1,2,2,3,3,1,1,2,2,3,3,... on successive executions + - With start_number=5, end_number=7, repeat_count=1: + Outputs 5,6,7,5,6,7,... on successive executions + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "start_number": ("INT", {"default": 1, "min": 1, "max": 1000, "step": 1}), + "end_number": ("INT", {"default": 10, "min": 1, "max": 1000, "step": 1}), + "repeat_count": ("INT", {"default": 1, "min": 1, "max": 100, "step": 1}), + }, + } + + RETURN_TYPES = ("INT",) + RETURN_NAMES = "NUMBER" + FUNCTION = "generate_number" + CATEGORY = "Logic-Support" + + # 클래스 변수로 현재 상태 저장 + current_number = 1 + current_repeat = 1 + + def generate_number(self, start_number, end_number, repeat_count): + # 범위 검증 - 시작 숫자가 종료 숫자보다 크면 값을 교환 + if start_number > end_number: + start_number, end_number = end_number, start_number + + # 클래스 변수가 현재 범위를 벗어나면 초기화 + if (NumberSequenceGenerator.current_number < start_number or + NumberSequenceGenerator.current_number > end_number): + NumberSequenceGenerator.current_number = start_number + NumberSequenceGenerator.current_repeat = 1 + + # 현재 숫자 저장 + result = NumberSequenceGenerator.current_number + + # 반복 횟수 증가 + NumberSequenceGenerator.current_repeat += 1 + + # 현재 숫자의 반복 횟수가 지정된 반복 횟수에 도달하면 다음 숫자로 이동 + if NumberSequenceGenerator.current_repeat > repeat_count: + NumberSequenceGenerator.current_number += 1 + NumberSequenceGenerator.current_repeat = 1 + + # 종료 숫자를 넘어가면 시작 숫자로 돌아감 + if NumberSequenceGenerator.current_number > end_number: + NumberSequenceGenerator.current_number = start_number + + return (result,) + +NODE_CLASS_MAPPINGS = { + "NumberSequenceGenerator": NumberSequenceGenerator +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "NumberSequenceGenerator": "Number Sequence Generator" +} diff --git a/test_number_sequence_generator.py b/test_number_sequence_generator.py new file mode 100644 index 0000000..971df97 --- /dev/null +++ b/test_number_sequence_generator.py @@ -0,0 +1,73 @@ +import unittest +from number_sequence_generator import NumberSequenceGenerator + +class TestNumberSequenceGenerator(unittest.TestCase): + def setUp(self): + # 각 테스트 전에 클래스 변수 초기화 + NumberSequenceGenerator.current_number = 1 + NumberSequenceGenerator.current_repeat = 1 + self.generator = NumberSequenceGenerator() + + def test_basic_sequence(self): + """기본 시퀀스 생성 테스트 (1~3, 반복 1회)""" + # 1, 2, 3, 1, 2, 3 순서로 생성되어야 함 + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 3) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 3) + + def test_repeated_sequence(self): + """반복 시퀀스 생성 테스트 (1~3, 반복 2회)""" + # 1, 1, 2, 2, 3, 3, 1, 1 순서로 생성되어야 함 + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 2) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 2) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + + def test_range_validation(self): + """범위 검증 테스트 (시작 숫자가 종료 숫자보다 큰 경우)""" + # 시작 숫자(10)가 종료 숫자(5)보다 크면 값이 교환되어야 함 + # 따라서 5, 6, 7, 8, 9, 10 순서로 생성되어야 함 + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 5) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 6) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 7) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 8) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 9) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 10) + self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 5) + + def test_change_range(self): + """범위 변경 테스트""" + # 처음에 1~3 범위 사용 + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2) + + # 범위를 5~7로 변경 + self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 5) + self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 6) + self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 7) + self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 5) + + def test_change_repeat(self): + """반복 횟수 변경 테스트""" + # 처음에 반복 1회 사용 + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2) + + # 반복 횟수를 2회로 변경 + # 현재 숫자는 3이고, 반복 횟수는 1이므로 3이 한 번 더 출력되어야 함 + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3) + + # 다음 숫자인 1이 2번 반복되어야 함 + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1) + +if __name__ == '__main__': + unittest.main()