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.")
|
|
})
|
|
}
|
|
}
|