package qb

import (
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/suite"
	"testing"
)

type TypeTestSuite struct {
	suite.Suite
}

func (suite *TypeTestSuite) TestTypes() {
	dialect := NewDialect("")

	precisionType := Type("FLOAT").Precision(2, 5)

	assert.Equal(suite.T(), "FLOAT(2, 5)", dialect.CompileType(precisionType))

	assert.Equal(suite.T(), "CHAR", dialect.CompileType(Char()))
	assert.Equal(suite.T(), "VARCHAR(255)", dialect.CompileType(Varchar()))
	assert.Equal(suite.T(), "TEXT", dialect.CompileType(Text()))
	assert.Equal(suite.T(), "INT", dialect.CompileType(Int()))
	assert.Equal(suite.T(), "SMALLINT", dialect.CompileType(SmallInt()))
	assert.Equal(suite.T(), "BIGINT", dialect.CompileType(BigInt()))
	assert.Equal(suite.T(), "NUMERIC(2, 5)", dialect.CompileType(Numeric().Precision(2, 5)))
	assert.Equal(suite.T(), "DECIMAL", dialect.CompileType(Decimal()))
	assert.Equal(suite.T(), "FLOAT", dialect.CompileType(Float()))
	assert.Equal(suite.T(), "BOOLEAN", dialect.CompileType(Boolean()))
	assert.Equal(suite.T(), "TIMESTAMP", dialect.CompileType(Timestamp()))
	assert.Equal(suite.T(), "BLOB", dialect.CompileType(Blob()))
	assert.Equal(suite.T(), "UUID", dialect.CompileType(UUID()))
}

func (suite *TypeTestSuite) TestUnsigned() {
	assert.Equal(suite.T(), "BIGINT", DefaultCompileType(BigInt().Signed(), true))
	assert.Equal(suite.T(), "BIGINT UNSIGNED", DefaultCompileType(BigInt().Unsigned(), true))
	assert.Equal(suite.T(), "NUMERIC(2, 5) UNSIGNED", DefaultCompileType(Numeric().Precision(2, 5).Unsigned(), true))

	assert.Equal(suite.T(), "INT", DefaultCompileType(Int().Signed(), false))
	assert.Equal(suite.T(), "SMALLINT", DefaultCompileType(TinyInt().Unsigned(), false))
	assert.Equal(suite.T(), "INT", DefaultCompileType(SmallInt().Unsigned(), false))
	assert.Equal(suite.T(), "BIGINT", DefaultCompileType(Int().Unsigned(), false))
	assert.Equal(suite.T(), "BIGINT", DefaultCompileType(BigInt().Unsigned(), false))
}

func TestTypeTestSuite(t *testing.T) {
	suite.Run(t, new(TypeTestSuite))
}