NumberSequenceGenerator 노드 추가 - 지정된 범위의 숫자를 반복 횟수만큼 출력
This commit is contained in:
+6
-2
@@ -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']
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user