203 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package models_test
 | 
						|
 | 
						|
import (
 | 
						|
	"sort"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
 | 
						|
	"github.com/stretchr/testify/assert"
 | 
						|
)
 | 
						|
 | 
						|
func TestPlan_ReorderSteps(t *testing.T) {
 | 
						|
	type testCase struct {
 | 
						|
		name           string
 | 
						|
		initialPlan    *models.Plan
 | 
						|
		expectedOrders []int
 | 
						|
	}
 | 
						|
 | 
						|
	testCases := []testCase{
 | 
						|
		// --- Test Cases for Tasks ---
 | 
						|
		{
 | 
						|
			name: "Tasks: 完美顺序",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
					{ExecutionOrder: 3},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 有间断",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 3},
 | 
						|
					{ExecutionOrder: 5},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 从0开始",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: 0},
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 完全无序",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: 8},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
					{ExecutionOrder: 4},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 包含负数",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: -5},
 | 
						|
					{ExecutionOrder: 10},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 空切片",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks:       []models.Task{},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "Tasks: 单个元素",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeTasks,
 | 
						|
				Tasks: []models.Task{
 | 
						|
					{ExecutionOrder: 100},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1},
 | 
						|
		},
 | 
						|
		// --- Test Cases for SubPlans ---
 | 
						|
		{
 | 
						|
			name: "SubPlans: 完美顺序",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
					{ExecutionOrder: 3},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 有间断",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 3},
 | 
						|
					{ExecutionOrder: 5},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 从0开始",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: 0},
 | 
						|
					{ExecutionOrder: 1},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 完全无序",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: 8},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
					{ExecutionOrder: 4},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 包含负数",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: -5},
 | 
						|
					{ExecutionOrder: 10},
 | 
						|
					{ExecutionOrder: 2},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1, 2, 3},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 空切片",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans:    []models.SubPlan{},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name: "SubPlans: 单个元素",
 | 
						|
			initialPlan: &models.Plan{
 | 
						|
				ContentType: models.PlanContentTypeSubPlans,
 | 
						|
				SubPlans: []models.SubPlan{
 | 
						|
					{ExecutionOrder: 100},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			expectedOrders: []int{1},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range testCases {
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
			// 调用被测试的方法
 | 
						|
			tc.initialPlan.ReorderSteps()
 | 
						|
 | 
						|
			// 提取并验证最终的顺序
 | 
						|
			finalOrders := make([]int, 0)
 | 
						|
			if tc.initialPlan.ContentType == models.PlanContentTypeTasks {
 | 
						|
				for _, task := range tc.initialPlan.Tasks {
 | 
						|
					finalOrders = append(finalOrders, task.ExecutionOrder)
 | 
						|
				}
 | 
						|
			} else if tc.initialPlan.ContentType == models.PlanContentTypeSubPlans {
 | 
						|
				for _, subPlan := range tc.initialPlan.SubPlans {
 | 
						|
					finalOrders = append(finalOrders, subPlan.ExecutionOrder)
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// 对 finalOrders 进行排序,以确保比较的一致性,因为 ReorderSteps 后的顺序是固定的
 | 
						|
			sort.Ints(finalOrders)
 | 
						|
 | 
						|
			assert.Equal(t, tc.expectedOrders, finalOrders, "The final execution orders should be a continuous sequence starting from 1.")
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |