Skip to content
/ cmps Public

通过 tag 比较相同结构体不同实例大小

License

Notifications You must be signed in to change notification settings

Drelf2018/cmps

Repository files navigation

cmps

通过 tag 比较相同结构体不同实例大小

详见 cmps_test.go

package cmps_test

import (
	"testing"

	"github.com/Drelf2018/cmps"
)

type Scores struct {
	Chinese float64
	Math    float64
	English float64
}

type Student struct {
	Name   string
	ID     int64 `cmps:"810"`
	Male   bool  `cmps:"514"`
	Scores `cmps:"1919;fields:Math,Chinese,English"`
}

func testCmpsOrdered() bool {
	// int
	if cmps.Compare(1, 2) != -1 {
		return false
	}
	if cmps.Compare(1, 1) != 0 {
		return false
	}
	if cmps.Compare(2, 1) != 1 {
		return false
	}
	// float
	if cmps.Compare(1.5, 2.5) != -1 {
		return false
	}
	if cmps.Compare(1.5, 1.5) != 0 {
		return false
	}
	if cmps.Compare(2.5, 1.5) != 1 {
		return false
	}
	// bool
	if cmps.Compare(false, true) != -1 {
		return false
	}
	if cmps.Compare(false, false) != 0 {
		return false
	}
	if cmps.Compare(true, true) != 0 {
		return false
	}
	if cmps.Compare(true, false) != 1 {
		return false
	}
	// string
	if cmps.Compare("1", "2") != -1 {
		return false
	}
	if cmps.Compare("1", "1") != 0 {
		return false
	}
	if cmps.Compare("2", "1") != 1 {
		return false
	}
	return true
}

func testStruct() bool {
	s1 := Student{
		Name: "张三1",
		ID:   2,
		Male: false,
		Scores: Scores{
			Chinese: 90,
			Math:    60,
			English: 80,
		},
	}
	s2 := Student{
		Name: "张三2",
		ID:   2,
		Male: false,
		Scores: Scores{
			Chinese: 90,
			Math:    60,
			English: 80,
		},
	}
	// Order: Male ID Math Chinese English
	if cmps.Compare(s1, s2) != 0 {
		return false
	}
	s2.Male = true
	if cmps.Compare(s1, s2) != -1 {
		return false
	}
	s1.Male = true
	if cmps.Compare(s1, s2) != 0 {
		return false
	}
	s2.Male = false
	if cmps.Compare(s1, s2) != 1 {
		return false
	}
	s1.Male = false
	s1.ID = 1
	if cmps.Compare(s1, s2) != -1 {
		return false
	}
	s1.ID = 3
	if cmps.Compare(s1, s2) != 1 {
		return false
	}
	s1.ID = 2
	s1.Math = 50
	if cmps.Compare(s1, s2) != -1 {
		return false
	}
	s1.Math = 70
	if cmps.Compare(s1, s2) != 1 {
		return false
	}
	s1.Math = 60
	s1.Chinese = 80
	if cmps.Compare(s1, s2) != -1 {
		return false
	}
	s1.Chinese = 100
	if cmps.Compare(s1, s2) != 1 {
		return false
	}
	s1.Chinese = 90
	s1.English = 70
	if cmps.Compare(s1, s2) != -1 {
		return false
	}
	s1.English = 90
	if cmps.Compare(s1, s2) != 1 {
		return false
	}
	return true
}

func TestMain(t *testing.T) {
	i := 1
	for ; i > 0; i-- {
		if !testCmpsOrdered() {
			break
		}
		if !testStruct() {
			break
		}
	}
	if i != 0 {
		t.Fail()
	}
}

About

通过 tag 比较相同结构体不同实例大小

Topics

Resources

License

Stars

Watchers

Forks

Languages