From 7106f8bbe563bf0b33232b7603806cbea1a28899 Mon Sep 17 00:00:00 2001 From: "Jisung, Ahn" Date: Fri, 30 May 2025 12:14:38 +0900 Subject: [PATCH] =?UTF-8?q?NumberSequenceGenerator=20=EB=85=B8=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=EC=A7=80=EC=A0=95=EB=90=9C=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=EC=9D=98=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=EB=B3=B5=20=ED=9A=9F=EC=88=98=EB=A7=8C=ED=81=BC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __init__.py | 8 +++- number_sequence_generator.py | 72 ++++++++++++++++++++++++++++++ test_number_sequence_generator.py | 73 +++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 number_sequence_generator.py create mode 100644 test_number_sequence_generator.py 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()