github.com/dahs81/otto@v0.2.1-0.20160126165905-6400716cf085/helper/vagrant/ui_test.go (about)

     1  package vagrant
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  func TestVagrantUi(t *testing.T) {
     9  	cases := map[string]struct {
    10  		Types    []string
    11  		Messages []string
    12  		Outputs  []*Output
    13  	}{
    14  		"basic": {
    15  			[]string{"ui"},
    16  			[]string{"1376289459,,ui,say,foo bar"},
    17  			[]*Output{
    18  				&Output{
    19  					Timestamp: "1376289459",
    20  					Target:    "",
    21  					Type:      "ui",
    22  					Data: []string{
    23  						"say",
    24  						"foo bar",
    25  					},
    26  				},
    27  			},
    28  		},
    29  
    30  		"multiple": {
    31  			[]string{"ui"},
    32  			[]string{
    33  				"1376289459,,ui,say,foo bar",
    34  				"\n",
    35  				"1376289459,,ui,say,baz",
    36  			},
    37  			[]*Output{
    38  				&Output{
    39  					Timestamp: "1376289459",
    40  					Target:    "",
    41  					Type:      "ui",
    42  					Data: []string{
    43  						"say",
    44  						"foo bar",
    45  					},
    46  				},
    47  				&Output{
    48  					Timestamp: "1376289459",
    49  					Target:    "",
    50  					Type:      "ui",
    51  					Data: []string{
    52  						"say",
    53  						"baz",
    54  					},
    55  				},
    56  			},
    57  		},
    58  
    59  		"multiple in one": {
    60  			[]string{"ui"},
    61  			[]string{
    62  				"1376289459,,ui,say,foo bar\n1376289459,,ui,say,baz\n1376289459,,ui,say,qux",
    63  			},
    64  			[]*Output{
    65  				&Output{
    66  					Timestamp: "1376289459",
    67  					Target:    "",
    68  					Type:      "ui",
    69  					Data: []string{
    70  						"say",
    71  						"foo bar",
    72  					},
    73  				},
    74  				&Output{
    75  					Timestamp: "1376289459",
    76  					Target:    "",
    77  					Type:      "ui",
    78  					Data: []string{
    79  						"say",
    80  						"baz",
    81  					},
    82  				},
    83  				&Output{
    84  					Timestamp: "1376289459",
    85  					Target:    "",
    86  					Type:      "ui",
    87  					Data: []string{
    88  						"say",
    89  						"qux",
    90  					},
    91  				},
    92  			},
    93  		},
    94  
    95  		"trailing newline": {
    96  			[]string{"ui"},
    97  			[]string{
    98  				"1376289459,,ui,say,foo bar",
    99  				"\n",
   100  				"1376289459,,ui,say,baz\n",
   101  			},
   102  			[]*Output{
   103  				&Output{
   104  					Timestamp: "1376289459",
   105  					Target:    "",
   106  					Type:      "ui",
   107  					Data: []string{
   108  						"say",
   109  						"foo bar",
   110  					},
   111  				},
   112  				&Output{
   113  					Timestamp: "1376289459",
   114  					Target:    "",
   115  					Type:      "ui",
   116  					Data: []string{
   117  						"say",
   118  						"baz",
   119  					},
   120  				},
   121  			},
   122  		},
   123  
   124  		"newlines in data": {
   125  			[]string{"ui"},
   126  			[]string{"1376289459,,ui,say,foo\\nbar"},
   127  			[]*Output{
   128  				&Output{
   129  					Timestamp: "1376289459",
   130  					Target:    "",
   131  					Type:      "ui",
   132  					Data: []string{
   133  						"say",
   134  						"foo\nbar",
   135  					},
   136  				},
   137  			},
   138  		},
   139  
   140  		"carriage return in data": {
   141  			[]string{"ui"},
   142  			[]string{"1376289459,,ui,say,foo\\rbar"},
   143  			[]*Output{
   144  				&Output{
   145  					Timestamp: "1376289459",
   146  					Target:    "",
   147  					Type:      "ui",
   148  					Data: []string{
   149  						"say",
   150  						"foo\rbar",
   151  					},
   152  				},
   153  			},
   154  		},
   155  
   156  		"comma in data": {
   157  			[]string{"ui"},
   158  			[]string{"1376289459,,ui,say,foo%!(VAGRANT_COMMA)bar"},
   159  			[]*Output{
   160  				&Output{
   161  					Timestamp: "1376289459",
   162  					Target:    "",
   163  					Type:      "ui",
   164  					Data: []string{
   165  						"say",
   166  						"foo,bar",
   167  					},
   168  				},
   169  			},
   170  		},
   171  
   172  		"invalid line": {
   173  			[]string{"invalid", "ui"},
   174  			[]string{"foo\n1376289459,,ui,say,foo%!(VAGRANT_COMMA)bar"},
   175  			[]*Output{
   176  				&Output{
   177  					Timestamp: "",
   178  					Target:    "",
   179  					Type:      "invalid",
   180  					Data: []string{
   181  						"foo",
   182  					},
   183  				},
   184  				&Output{
   185  					Timestamp: "1376289459",
   186  					Target:    "",
   187  					Type:      "ui",
   188  					Data: []string{
   189  						"say",
   190  						"foo,bar",
   191  					},
   192  				},
   193  			},
   194  		},
   195  
   196  		"unregistered type": {
   197  			[]string{"ui"},
   198  			[]string{"1376289459,,not-ui,say,foo bar"},
   199  			[]*Output{},
   200  		},
   201  	}
   202  
   203  	for name, tc := range cases {
   204  		actual := make([]*Output, 0, len(tc.Outputs))
   205  		recordCallback := func(o *Output) {
   206  			actual = append(actual, o)
   207  		}
   208  
   209  		callbacks := make(map[string]OutputCallback)
   210  		for _, t := range tc.Types {
   211  			callbacks[t] = recordCallback
   212  		}
   213  
   214  		ui := &vagrantUi{Callbacks: callbacks}
   215  		for _, msg := range tc.Messages {
   216  			ui.Raw(msg)
   217  		}
   218  		ui.Finish()
   219  
   220  		if !reflect.DeepEqual(actual, tc.Outputs) {
   221  			t.Fatalf("%s\n\n%#v\n\n%#v", name, actual, tc.Outputs)
   222  		}
   223  	}
   224  }