package export_wit_world
import (
"fmt"
test "wit_component/my_test_i"
witTypes "go.bytecodealliance.org/pkg/wit/types"
)
func Run() {
write := make(chan witTypes.Unit)
read := make(chan witTypes.Unit)
{
tx, rx := test.MakeStreamUnit()
go func() {
assertEqual(tx.Write([]witTypes.Unit{witTypes.Unit{}}), 1)
assert(!tx.ReaderDropped())
assertEqual(tx.Write([]witTypes.Unit{witTypes.Unit{}, witTypes.Unit{}}), 2)
assertEqual(tx.Write([]witTypes.Unit{witTypes.Unit{}, witTypes.Unit{}}), 0)
assert(tx.ReaderDropped())
write <- witTypes.Unit{}
}()
go func() {
test.ReadStream(rx)
read <- witTypes.Unit{}
}()
(<-read)
(<-write)
}
{
tx, rx := test.MakeStreamUnit()
syncBarrier := make(chan struct{})
panicCh := make(chan any, 2)
for range 2 {
go func() {
<-syncBarrier
panicCh <- checkPanicValue(func() {
result := make([]witTypes.Unit, 1)
rx.Read(result)
})
}()
}
close(syncBarrier)
go func() {
tx.WriteAll([]witTypes.Unit{witTypes.Unit{}})
}()
p1, p2 := <-panicCh, <-panicCh
assert((p1 == nil && p2 == "nil handle") || (p1 == "nil handle" && p2 == nil))
}
{
tx, rx := test.MakeStreamUnit()
syncBarrier := make(chan struct{})
panicCh := make(chan any, 2)
for range 2 {
go func() {
<-syncBarrier
panicCh <- checkPanicValue(func() {
tx.WriteAll([]witTypes.Unit{witTypes.Unit{}})
})
}()
}
close(syncBarrier)
go func() {
result := make([]witTypes.Unit, 1)
rx.Read(result)
}()
p1, p2 := <-panicCh, <-panicCh
assert((p1 == nil && p2 == "nil handle") || (p1 == "nil handle" && p2 == nil))
}
}
func assertEqual[T comparable](a, b T) {
if a != b {
panic(fmt.Sprintf("%v not equal to %v", a, b))
}
}
func assert(v bool) {
if !v {
panic("assertion failed")
}
}
func checkPanicValue(f func()) (value any) {
defer func() {
value = recover()
}()
f()
return nil
}