| package matchers |
| |
| import ( |
| "fmt" |
| "os" |
| |
| "github.com/onsi/gomega/format" |
| ) |
| |
| type notADirectoryError struct { |
| os.FileInfo |
| } |
| |
| func (t notADirectoryError) Error() string { |
| fileInfo := os.FileInfo(t) |
| switch { |
| case fileInfo.Mode().IsRegular(): |
| return "file is a regular file" |
| default: |
| return fmt.Sprintf("file mode is: %s", fileInfo.Mode().String()) |
| } |
| } |
| |
| type BeADirectoryMatcher struct { |
| expected interface{} |
| err error |
| } |
| |
| func (matcher *BeADirectoryMatcher) Match(actual interface{}) (success bool, err error) { |
| actualFilename, ok := actual.(string) |
| if !ok { |
| return false, fmt.Errorf("BeADirectoryMatcher matcher expects a file path") |
| } |
| |
| fileInfo, err := os.Stat(actualFilename) |
| if err != nil { |
| matcher.err = err |
| return false, nil |
| } |
| |
| if !fileInfo.Mode().IsDir() { |
| matcher.err = notADirectoryError{fileInfo} |
| return false, nil |
| } |
| return true, nil |
| } |
| |
| func (matcher *BeADirectoryMatcher) FailureMessage(actual interface{}) (message string) { |
| return format.Message(actual, fmt.Sprintf("to be a directory: %s", matcher.err)) |
| } |
| |
| func (matcher *BeADirectoryMatcher) NegatedFailureMessage(actual interface{}) (message string) { |
| return format.Message(actual, fmt.Sprintf("not be a directory")) |
| } |