// Copyright 2023 ROC. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.

package http

import (
	g "github.com/onsi/ginkgo/v2"
	m "github.com/onsi/gomega"
)

var _ = g.Describe("Mux", g.Ordered, func() {
	var smm, pmm muxMap[int]

	g.BeforeAll(func() {
		smm = make(simpleMuxMap[int])
		pmm = &prefixMuxMap[int]{
			m:      make(map[string]int),
			prefix: "/connect",
		}
	})

	g.It("simple mux map", func() {
		ok := smm.set("/core.v1.AuthenticateService/", 1)
		m.Expect(ok).To(m.BeTrue())

		ok = smm.set("/core.v1.AuthenticateService/", 2)
		m.Expect(ok).To(m.BeFalse())

		smm.set("/greet.v1.GreetService/", 2)
		val, exist := smm.get("/greet.v1.GreetService/")
		m.Expect(val).To(m.Equal(2))
		m.Expect(exist).To(m.BeTrue())

		_, exist = smm.get("/greet.v1.OtherService/")
		m.Expect(exist).To(m.BeFalse())

		val, exist = smm.match("/core.v1.AuthenticateService/login")
		m.Expect(val).To(m.Equal(1))
		m.Expect(exist).To(m.BeTrue())

		val, exist = smm.match("/core.v1.AuthenticateService/logout")
		m.Expect(val).To(m.Equal(1))
		m.Expect(exist).To(m.BeTrue())
	})

	g.It("prefix mux map", func() {
		ok := pmm.set("/core.v1.AuthenticateService/", 1)
		m.Expect(ok).To(m.BeTrue())

		ok = pmm.set("/core.v1.AuthenticateService/", 2)
		m.Expect(ok).To(m.BeFalse())

		pmm.set("/greet.v1.GreetService/", 2)
		val, exist := pmm.get("/greet.v1.GreetService/")
		m.Expect(val).To(m.Equal(2))
		m.Expect(exist).To(m.BeTrue())

		_, exist = pmm.get("/greet.v1.OtherService/")
		m.Expect(exist).To(m.BeFalse())

		val, exist = pmm.match("/connect/core.v1.AuthenticateService/login")
		m.Expect(val).To(m.Equal(1))
		m.Expect(exist).To(m.BeTrue())

		val, exist = pmm.match("/connect/core.v1.AuthenticateService/logout")
		m.Expect(val).To(m.Equal(1))
		m.Expect(exist).To(m.BeTrue())

		_, exist = pmm.match("/core.v1.AuthenticateService/logout")
		m.Expect(exist).To(m.BeFalse())
	})
})