| package gexec | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 |  | 
 | 	"github.com/onsi/gomega/format" | 
 | ) | 
 |  | 
 | /* | 
 | The Exit matcher operates on a session: | 
 |  | 
 | 	Ω(session).Should(Exit(<optional status code>)) | 
 |  | 
 | Exit passes if the session has already exited. | 
 |  | 
 | If no status code is provided, then Exit will succeed if the session has exited regardless of exit code. | 
 | Otherwise, Exit will only succeed if the process has exited with the provided status code. | 
 |  | 
 | Note that the process must have already exited.  To wait for a process to exit, use Eventually: | 
 |  | 
 | 	Eventually(session, 3).Should(Exit(0)) | 
 | */ | 
 | func Exit(optionalExitCode ...int) *exitMatcher { | 
 | 	exitCode := -1 | 
 | 	if len(optionalExitCode) > 0 { | 
 | 		exitCode = optionalExitCode[0] | 
 | 	} | 
 |  | 
 | 	return &exitMatcher{ | 
 | 		exitCode: exitCode, | 
 | 	} | 
 | } | 
 |  | 
 | type exitMatcher struct { | 
 | 	exitCode       int | 
 | 	didExit        bool | 
 | 	actualExitCode int | 
 | } | 
 |  | 
 | type Exiter interface { | 
 | 	ExitCode() int | 
 | } | 
 |  | 
 | func (m *exitMatcher) Match(actual interface{}) (success bool, err error) { | 
 | 	exiter, ok := actual.(Exiter) | 
 | 	if !ok { | 
 | 		return false, fmt.Errorf("Exit must be passed a gexec.Exiter (Missing method ExitCode() int) Got:\n%s", format.Object(actual, 1)) | 
 | 	} | 
 |  | 
 | 	m.actualExitCode = exiter.ExitCode() | 
 |  | 
 | 	if m.actualExitCode == -1 { | 
 | 		return false, nil | 
 | 	} | 
 |  | 
 | 	if m.exitCode == -1 { | 
 | 		return true, nil | 
 | 	} | 
 | 	return m.exitCode == m.actualExitCode, nil | 
 | } | 
 |  | 
 | func (m *exitMatcher) FailureMessage(actual interface{}) (message string) { | 
 | 	if m.actualExitCode == -1 { | 
 | 		return "Expected process to exit.  It did not." | 
 | 	} else { | 
 | 		return format.Message(m.actualExitCode, "to match exit code:", m.exitCode) | 
 | 	} | 
 | } | 
 |  | 
 | func (m *exitMatcher) NegatedFailureMessage(actual interface{}) (message string) { | 
 | 	if m.actualExitCode == -1 { | 
 | 		return "you really shouldn't be able to see this!" | 
 | 	} else { | 
 | 		if m.exitCode == -1 { | 
 | 			return "Expected process not to exit.  It did." | 
 | 		} else { | 
 | 			return format.Message(m.actualExitCode, "not to match exit code:", m.exitCode) | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func (m *exitMatcher) MatchMayChangeInTheFuture(actual interface{}) bool { | 
 | 	session, ok := actual.(*Session) | 
 | 	if ok { | 
 | 		return session.ExitCode() == -1 | 
 | 	} | 
 | 	return true | 
 | } |