Newer
Older
pokemon-go-trade / vendor / github.com / go-pg / pg / orm / internal_test.go
package orm

import (
	"reflect"
	"sync"
	"testing"
)

type TableInitRace struct {
	Id  int
	Foo int

	HasSelf   *TableInitRace
	HasSelfId int

	HasOne1   *TableInitRace1
	HasOne1Id int

	HasAnother1   *TableInitRace1
	HasAnother1Id int

	Bar int
}

type TableInitRace1 struct {
	Id  int
	Foo int

	HasOne2   *TableInitRace2
	HasOne2Id int

	Bar int
}

type TableInitRace2 struct {
	Id  int
	Foo int

	HasOne3   *TableInitRace3
	HasOne3Id int

	Bar int
}

type TableInitRace3 struct {
	Id  int
	Foo int
	Bar int
}

func TestTableInitRace(t *testing.T) {
	const C = 16

	types := []reflect.Type{
		reflect.TypeOf((*TableInitRace)(nil)).Elem(),
		reflect.TypeOf((*TableInitRace1)(nil)).Elem(),
		reflect.TypeOf((*TableInitRace2)(nil)).Elem(),
		reflect.TypeOf((*TableInitRace3)(nil)).Elem(),
	}

	var wg sync.WaitGroup
	for _, typ := range types {
		wg.Add(C)
		for i := 0; i < C; i++ {
			go func(typ reflect.Type, i int) {
				if i%2 == 0 {
					_ = _tables.get(typ, true)
				} else {
					_ = _tables.get(typ, false)
				}
				wg.Done()
			}(typ, i)
		}
	}
	wg.Wait()
}

type TableInlineRace struct {
	Id  int
	Foo int

	R1   *TableInlineRace1
	R1Id int
	R10  *TableInlineRace1

	R2   *TableInlineRace2
	R2Id int
	R20  *TableInlineRace2

	R3   *TableInitRace3
	R3Id int
	R30  *TableInitRace3
}

type TableInlineRace1 struct {
	Id   int
	Foo1 int

	R2   *TableInlineRace2
	R2Id int
	R20  *TableInlineRace2

	R3   *TableInitRace3
	R3Id int
	R30  *TableInitRace3
}

type TableInlineRace2 struct {
	Id   int
	Foo2 int

	R3   *TableInlineRace3
	R3Id int
	R30  *TableInlineRace3
}

type TableInlineRace3 struct {
	Id   int
	Foo2 int
}

func TestTableInlineRace(t *testing.T) {
	const C = 32

	types := []reflect.Type{
		reflect.TypeOf((*TableInlineRace)(nil)).Elem(),
		reflect.TypeOf((*TableInlineRace1)(nil)).Elem(),
		reflect.TypeOf((*TableInlineRace2)(nil)).Elem(),
		reflect.TypeOf((*TableInlineRace3)(nil)).Elem(),
	}

	var wg sync.WaitGroup
	for _, typ := range types {
		wg.Add(C)
		for i := 0; i < C; i++ {
			go func(typ reflect.Type, i int) {
				_ = _tables.get(typ, false)
				wg.Done()
			}(typ, i)
		}
	}
	wg.Wait()
}