package assertions import ( "fmt" "github.com/smartystreets/assertions/internal/oglematchers" ) // ShouldBeGreaterThan receives exactly two parameters and ensures that the first is greater than the second. func ShouldBeGreaterThan(actual interface{}, expected ...interface{}) string { if fail := need(1, expected); fail != success { return fail } if matchError := oglematchers.GreaterThan(expected[0]).Matches(actual); matchError != nil { return fmt.Sprintf(shouldHaveBeenGreater, actual, expected[0]) } return success } // ShouldBeGreaterThanOrEqualTo receives exactly two parameters and ensures that the first is greater than or equal to the second. func ShouldBeGreaterThanOrEqualTo(actual interface{}, expected ...interface{}) string { if fail := need(1, expected); fail != success { return fail } else if matchError := oglematchers.GreaterOrEqual(expected[0]).Matches(actual); matchError != nil { return fmt.Sprintf(shouldHaveBeenGreaterOrEqual, actual, expected[0]) } return success } // ShouldBeLessThan receives exactly two parameters and ensures that the first is less than the second. func ShouldBeLessThan(actual interface{}, expected ...interface{}) string { if fail := need(1, expected); fail != success { return fail } else if matchError := oglematchers.LessThan(expected[0]).Matches(actual); matchError != nil { return fmt.Sprintf(shouldHaveBeenLess, actual, expected[0]) } return success } // ShouldBeLessThan receives exactly two parameters and ensures that the first is less than or equal to the second. func ShouldBeLessThanOrEqualTo(actual interface{}, expected ...interface{}) string { if fail := need(1, expected); fail != success { return fail } else if matchError := oglematchers.LessOrEqual(expected[0]).Matches(actual); matchError != nil { return fmt.Sprintf(shouldHaveBeenLess, actual, expected[0]) } return success } // ShouldBeBetween receives exactly three parameters: an actual value, a lower bound, and an upper bound. // It ensures that the actual value is between both bounds (but not equal to either of them). func ShouldBeBetween(actual interface{}, expected ...interface{}) string { if fail := need(2, expected); fail != success { return fail } lower, upper, fail := deriveBounds(expected) if fail != success { return fail } else if !isBetween(actual, lower, upper) { return fmt.Sprintf(shouldHaveBeenBetween, actual, lower, upper) } return success } // ShouldNotBeBetween receives exactly three parameters: an actual value, a lower bound, and an upper bound. // It ensures that the actual value is NOT between both bounds. func ShouldNotBeBetween(actual interface{}, expected ...interface{}) string { if fail := need(2, expected); fail != success { return fail } lower, upper, fail := deriveBounds(expected) if fail != success { return fail } else if isBetween(actual, lower, upper) { return fmt.Sprintf(shouldNotHaveBeenBetween, actual, lower, upper) } return success } func deriveBounds(values []interface{}) (lower interface{}, upper interface{}, fail string) { lower = values[0] upper = values[1] if ShouldNotEqual(lower, upper) != success { return nil, nil, fmt.Sprintf(shouldHaveDifferentUpperAndLower, lower) } else if ShouldBeLessThan(lower, upper) != success { lower, upper = upper, lower } return lower, upper, success } func isBetween(value, lower, upper interface{}) bool { if ShouldBeGreaterThan(value, lower) != success { return false } else if ShouldBeLessThan(value, upper) != success { return false } return true } // ShouldBeBetweenOrEqual receives exactly three parameters: an actual value, a lower bound, and an upper bound. // It ensures that the actual value is between both bounds or equal to one of them. func ShouldBeBetweenOrEqual(actual interface{}, expected ...interface{}) string { if fail := need(2, expected); fail != success { return fail } lower, upper, fail := deriveBounds(expected) if fail != success { return fail } else if !isBetweenOrEqual(actual, lower, upper) { return fmt.Sprintf(shouldHaveBeenBetweenOrEqual, actual, lower, upper) } return success } // ShouldNotBeBetweenOrEqual receives exactly three parameters: an actual value, a lower bound, and an upper bound. // It ensures that the actual value is nopt between the bounds nor equal to either of them. func ShouldNotBeBetweenOrEqual(actual interface{}, expected ...interface{}) string { if fail := need(2, expected); fail != success { return fail } lower, upper, fail := deriveBounds(expected) if fail != success { return fail } else if isBetweenOrEqual(actual, lower, upper) { return fmt.Sprintf(shouldNotHaveBeenBetweenOrEqual, actual, lower, upper) } return success } func isBetweenOrEqual(value, lower, upper interface{}) bool { if ShouldBeGreaterThanOrEqualTo(value, lower) != success { return false } else if ShouldBeLessThanOrEqualTo(value, upper) != success { return false } return true }