// Copyright © 2016 Abcum Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package fncs

import (
	"context"
	"testing"

	. "github.com/smartystreets/goconvey/convey"
)

func TestIs(t *testing.T) {

	var res interface{}

	Convey("is.alpha(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.alpha", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.alpha", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.alpha", "aBcDe")
		So(res, ShouldEqual, true)
	})

	Convey("is.alphanum(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.alphanum", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.alphanum", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.alphanum", "aB3De")
		So(res, ShouldEqual, true)
	})

	Convey("is.ascii(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.ascii", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.ascii", "testing®")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.ascii", "aB3De")
		So(res, ShouldEqual, true)
	})

	Convey("is.domain(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.domain", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.domain", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.domain", "abcum.com")
		So(res, ShouldEqual, true)
	})

	Convey("is.email(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.email", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.email", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.email", "info@abcum.com")
		So(res, ShouldEqual, true)
	})

	Convey("is.hexadecimal(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.hexadecimal", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.hexadecimal", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.hexadecimal", "00bfff")
		So(res, ShouldEqual, true)
	})

	Convey("is.latitude(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.latitude", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.latitude", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.latitude", 0)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.latitude", -90)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.latitude", +90)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.latitude", "-90")
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.latitude", "+90")
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.latitude", -95)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.latitude", +95)
		So(res, ShouldEqual, false)
	})

	Convey("is.longitude(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.longitude", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.longitude", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.longitude", 0)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.longitude", -180)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.longitude", +180)
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.longitude", "-180")
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.longitude", "+180")
		So(res, ShouldEqual, true)
		res, _ = Run(context.Background(), "is.longitude", -185)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.longitude", +185)
		So(res, ShouldEqual, false)
	})

	Convey("is.numeric(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.numeric", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.numeric", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.numeric", "123456")
		So(res, ShouldEqual, true)
	})

	Convey("is.semver(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.semver", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.semver", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.semver", "1.0.32")
		So(res, ShouldEqual, true)
	})

	Convey("is.uuid(a) works properly", t, func() {
		res, _ = Run(context.Background(), "is.uuid", nil)
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.uuid", "test-©")
		So(res, ShouldEqual, false)
		res, _ = Run(context.Background(), "is.uuid", "8ddb11e8-755f-47cf-a84f-8033d1cfa1b9")
		So(res, ShouldEqual, true)
	})

}