package catalog import ( "strings" "testing" ) func TestAWorkflowsInputsAreCheckedWhenTheCatalogIsBuilt(t *testing.T) { one := 1.0 zero := 0.0 run := func(out string, inputs ...Input) Model { return comfyModel("/w/ace.safetensors", &ComfyUI{Workflow: "w.json", Output: out, Inputs: inputs}) } cat, err := New([]Model{run(OutputAudio, Input{Name: "tags", Type: InputText, Required: true}, Input{Name: "strength", Type: InputFloat, Min: &zero, Max: &one, Default: 0.5}, Input{Name: "style", Type: InputChoice, Choices: []string{"pop"}}, Input{Name: "clip", Type: InputVideo, MaxMB: 512})}) if err != nil { t.Fatal(err) } m, _ := cat.Resolve("flux") if !m.RunsWorkflows() || m.MakesImages() || m.MakesMeshes() || m.ComfyOutput() != OutputAudio || len(m.ComfyInputs()) != 4 { t.Errorf("an audio model: runs %v pictures %v meshes %v output %q", m.RunsWorkflows(), m.MakesImages(), m.MakesMeshes(), m.ComfyOutput()) } if m.ComfyInputs()[3].MaxBytes() != 512<<20 || (Input{Type: InputImage}).MaxBytes() != 16<<20 { t.Error("a file input's bound") } for name, c := range map[string]struct { m Model want string }{ "an unknown kind": {run("hologram"), "not one of pictures"}, "video, no workflow": {comfyModel("/w/x", &ComfyUI{Output: OutputVideo}), "makes video names its workflow"}, "a capital name": {run(OutputAudio, Input{Name: "Tags", Type: InputText}), "lowercase"}, "an unknown type": {run(OutputAudio, Input{Name: "x", Type: "colour"}), "not one of text"}, "a choice of nothing": {run(OutputAudio, Input{Name: "x", Type: InputChoice}), "no choices"}, "min above max": {run(OutputAudio, Input{Name: "x", Type: InputInt, Min: &one, Max: &zero}), "min above max"}, "required and default": {run(OutputAudio, Input{Name: "x", Type: InputInt, Required: true, Default: 3}), "one or the other"}, "a file's default": {run(OutputAudio, Input{Name: "x", Type: InputImage, Default: "a.png"}), "cannot have a default"}, "twice": {run(OutputAudio, Input{Name: "x", Type: InputText}, Input{Name: "x", Type: InputInt}), "declared twice"}, } { if _, err := New([]Model{c.m}); err == nil || !strings.Contains(err.Error(), c.want) { t.Errorf("%s: %v", name, err) } } }