test(utils): 添加事件驱动模型测试

- 在 sqrt_test.go 中添加了 fastSqr1 测试函数,用于测试事件驱动模型
- 新增了 Event 和 Uint32AsyncEvent 类型用于测试
- 更新了 go.work、go.mod 和
This commit is contained in:
2025-08-05 16:10:18 +08:00
parent bbbec5dff0
commit cd7583ba05
32 changed files with 1789 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
package orders
import (
"strings"
"time"
"github.com/badu/bus"
"github.com/badu/bus/test_scenarios/request-reply-callback/events"
)
type Order struct {
OrderID int
ProductIDs []int
}
type OrderStatus struct {
OrderID int
Status string
}
type RepositoryImpl struct {
sb *strings.Builder
calls int
}
func NewRepository(sb *strings.Builder) RepositoryImpl {
result := RepositoryImpl{sb: sb}
bus.Sub(result.onCreateOrder)
bus.Sub(result.onGetOrderStatus)
return result
}
func (r *RepositoryImpl) onCreateOrder(event *events.RequestEvent[Order]) {
defer func() { r.calls++ }()
<-time.After(500 * time.Millisecond) // simulate heavy database call
event.Callback = func() (*Order, error) {
return &Order{OrderID: r.calls, ProductIDs: event.Payload.ProductIDs}, nil
}
close(event.Done)
}
func (r *RepositoryImpl) onGetOrderStatus(event *events.RequestEvent[OrderStatus]) {
<-time.After(300 * time.Millisecond) // simulate heavy database call
event.Callback = func() (*OrderStatus, error) {
status := "in_progress"
if event.Payload.OrderID == 3 {
status = "cancelled"
}
return &OrderStatus{OrderID: event.Payload.OrderID, Status: status}, nil
}
close(event.Done)
}

View File

@@ -0,0 +1,35 @@
package orders
import (
"context"
"fmt"
"strings"
"github.com/badu/bus"
"github.com/badu/bus/test_scenarios/request-reply-callback/events"
)
type ServiceImpl struct {
sb *strings.Builder
}
func NewService(sb *strings.Builder) ServiceImpl {
result := ServiceImpl{sb: sb}
return result
}
func (s *ServiceImpl) RegisterOrder(ctx context.Context, productIDs []int) (*Order, error) {
event := events.NewRequestEvent[Order](Order{ProductIDs: productIDs})
s.sb.WriteString(fmt.Sprintf("dispatching event typed %T\n", event))
bus.Pub(event)
<-event.Done // wait for "reply"
return event.Callback() // return the callback, which is containing the actual result
}
func (s *ServiceImpl) GetOrderStatus(ctx context.Context, orderID int) (*OrderStatus, error) {
event := events.NewRequestEvent[OrderStatus](OrderStatus{OrderID: orderID})
s.sb.WriteString(fmt.Sprintf("dispatching event typed %T\n", event))
bus.Pub(event)
<-event.Done // wait for "reply"
return event.Callback() // return the callback, which is containing the actual result
}