package imapserver

import (
	"testing"

	"github.com/mjl-/mox/store"
)

func TestNumSetContains(t *testing.T) {
	num := func(v uint32) *setNumber {
		return &setNumber{v, false}
	}
	star := &setNumber{star: true}

	check := func(v bool) {
		t.Helper()
		if !v {
			t.Fatalf("bad")
		}
	}

	ss0 := numSet{true, nil} // "$"
	check(ss0.containsSeq(1, []store.UID{2}, []store.UID{2}))
	check(!ss0.containsSeq(1, []store.UID{2}, []store.UID{}))

	check(ss0.containsUID(1, []store.UID{1}, []store.UID{1}))
	check(ss0.containsUID(2, []store.UID{1, 2, 3}, []store.UID{2}))
	check(!ss0.containsUID(2, []store.UID{1, 2, 3}, []store.UID{}))
	check(!ss0.containsUID(2, []store.UID{}, []store.UID{2}))

	ss1 := numSet{false, []numRange{{*num(1), nil}}} // Single number 1.
	check(ss1.containsSeq(1, []store.UID{2}, nil))
	check(!ss1.containsSeq(2, []store.UID{1, 2}, nil))

	check(ss1.containsUID(1, []store.UID{1}, nil))
	check(ss1.containsSeq(1, []store.UID{2}, nil))
	check(!ss1.containsSeq(2, []store.UID{1, 2}, nil))

	// 2:*
	ss2 := numSet{false, []numRange{{*num(2), star}}}
	check(!ss2.containsSeq(1, []store.UID{2}, nil))
	check(ss2.containsSeq(2, []store.UID{4, 5}, nil))
	check(ss2.containsSeq(3, []store.UID{4, 5, 6}, nil))

	check(ss2.containsUID(2, []store.UID{2}, nil))
	check(ss2.containsUID(3, []store.UID{1, 2, 3}, nil))
	check(ss2.containsUID(2, []store.UID{2}, nil))
	check(!ss2.containsUID(2, []store.UID{4, 5}, nil))
	check(!ss2.containsUID(2, []store.UID{1}, nil))

	// *:2
	ss3 := numSet{false, []numRange{{*star, num(2)}}}
	check(ss3.containsSeq(1, []store.UID{2}, nil))
	check(ss3.containsSeq(2, []store.UID{4, 5}, nil))
	check(!ss3.containsSeq(3, []store.UID{1, 2, 3}, nil))

	check(ss3.containsUID(1, []store.UID{1}, nil))
	check(ss3.containsUID(2, []store.UID{1, 2, 3}, nil))
	check(!ss3.containsUID(1, []store.UID{2, 3}, nil))
	check(!ss3.containsUID(3, []store.UID{1, 2, 3}, nil))
}
