| 
					
				 | 
			
			
				@@ -1,5 +1,12 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package unit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"bytes" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"runtime" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"strings" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type Subject struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	assert *Assertion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	name   string 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,8 +19,43 @@ func NewSubject(assert *Assertion) *Subject { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// decorate prefixes the string with the file and line of the call site 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// and inserts the final newline if needed and indentation tabs for formatting. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func decorate(s string) string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	_, file, line, ok := runtime.Caller(4) // decorate + log + public function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// Truncate file name at last file name separator. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if index := strings.LastIndex(file, "/"); index >= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			file = file[index+1:] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if index = strings.LastIndex(file, "\\"); index >= 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			file = file[index+1:] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		file = "???" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		line = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	buf := new(bytes.Buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// Every line is indented at least one tab. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	buf.WriteString("  ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	fmt.Fprintf(buf, "%s:%d: ", file, line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lines := strings.Split(s, "\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if l := len(lines); l > 1 && lines[l-1] == "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		lines = lines[:l-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for i, line := range lines { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if i > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// Second and subsequent lines are indented an extra tab. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			buf.WriteString("\n\t\t") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		buf.WriteString(line) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	buf.WriteByte('\n') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return buf.String() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (subject *Subject) FailWithMessage(message string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	subject.assert.t.Error(message) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	fmt.Println(decorate(message)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	subject.assert.t.Fail() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (subject *Subject) Named(name string) { 
			 |