package di

import (
	"bytes"
	"context"
	"fmt"
	"strings"
	"testing"
)

func ExampleBuild() {
	var out bytes.Buffer
	app, err := Build(&out, false)
	if err != nil {
		panic(err)
	}
	value, err := app.Service.Lookup(context.Background(), "pen")
	fmt.Fprintln(&out, value, err)
	if err := app.Close(); err != nil {
		panic(err)
	}
	fmt.Print(out.String())
	out.Reset()
	_, err = Build(&out, true)
	fmt.Print(out.String())
	fmt.Println(err)
	// Output:
	// open store
	// open cache
	// value:pen <nil>
	// close cache
	// close store
	// open store
	// open cache
	// close cache
	// close store
	// handler setup failed
}
func TestTypedNil(t *testing.T) {
	var p *Resource
	var dep Store = p
	if dep == nil {
		t.Fatal("expected non-nil interface")
	}
	// Do not use this dependency: nil interface checks cannot reject every typed nil.
	t.Logf("typed pointer nil=%v interface nil=%v", p == nil, dep == nil)
}
func TestFailureCleanup(t *testing.T) {
	var out bytes.Buffer
	if _, err := Build(&out, true); err == nil {
		t.Fatal("expected error")
	}
	if !strings.HasSuffix(out.String(), "close cache\nclose store\n") {
		t.Fatal(out.String())
	}
}
