bitbucket.org/ai69/amoy@v0.2.3/line_test.go (about)

     1  package amoy
     2  
     3  import (
     4  	"reflect"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestExtractTopLines(t *testing.T) {
    10  	tests := []struct {
    11  		name    string
    12  		s       string
    13  		n       int
    14  		want    []string
    15  		wantErr bool
    16  	}{
    17  		{"Non-positive N", "Hello", 0, nil, true},
    18  		{"Empty string", "", 1, []string{}, false},
    19  		{"One line", "Hello", 1, []string{"Hello"}, false},
    20  		{"One line and newline", "Hello\n", 2, []string{"Hello"}, false},
    21  		{"Two lines", "Hello\nWorld", 2, []string{"Hello", "World"}, false},
    22  		{"Two lines and newline", "Hello\nWorld\n", 2, []string{"Hello", "World"}, false},
    23  		{"Three lines with newline", "Hello\n\nWorld\n", 3, []string{"Hello", "", "World"}, false},
    24  		{"All newlines", "\n\n\n", 1, []string{""}, false},
    25  		{"21 lines 1", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 1, []string{"a"}, false},
    26  		{"21 lines 2", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 2, []string{"a", "b"}, false},
    27  		{"21 lines 3", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 3, []string{"a", "b", "c"}, false},
    28  		{"21 lines 4", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 4, []string{"a", "b", "c", "d"}, false},
    29  		{"21 lines 10", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 10, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}, false},
    30  		{"21 lines 20", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 20, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"}, false},
    31  		{"21 lines 21", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 21, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
    32  		{"21 lines 22", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 22, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
    33  	}
    34  	for _, tt := range tests {
    35  		t.Run(tt.name, func(t *testing.T) {
    36  			got, err := ExtractTopLines(strings.NewReader(tt.s), tt.n)
    37  			if (err != nil) != tt.wantErr {
    38  				t.Errorf("ExtractTopLines() error = %v, wantErr %v", err, tt.wantErr)
    39  				return
    40  			}
    41  			if !reflect.DeepEqual(got, tt.want) {
    42  				t.Errorf("ExtractTopLines() got = %v, want %v", got, tt.want)
    43  			}
    44  		})
    45  	}
    46  }
    47  
    48  func TestExtractFirstLine(t *testing.T) {
    49  	tests := []struct {
    50  		name    string
    51  		s       string
    52  		want    string
    53  		wantErr bool
    54  	}{
    55  		{"Empty string", "", "", false},
    56  		{"One line", "Hello", "Hello", false},
    57  		{"One line and newline", "Hello\n", "Hello", false},
    58  		{"Two lines", "Hello\nWorld", "Hello", false},
    59  		{"Two lines and newline", "Hello\nWorld\n", "Hello", false},
    60  		{"Three lines with newline", "Hello\n\nWorld\n", "Hello", false},
    61  		{"All newlines", "\n\n\n", "", false},
    62  		{"21 lines", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", "a", false},
    63  	}
    64  	for _, tt := range tests {
    65  		t.Run(tt.name, func(t *testing.T) {
    66  			got, err := ExtractFirstLine(strings.NewReader(tt.s))
    67  			if (err != nil) != tt.wantErr {
    68  				t.Errorf("ExtractFirstLine() error = %v, wantErr %v", err, tt.wantErr)
    69  				return
    70  			}
    71  			if !reflect.DeepEqual(got, tt.want) {
    72  				t.Errorf("ExtractFirstLine() got = %v, want %v", got, tt.want)
    73  			}
    74  		})
    75  	}
    76  }
    77  
    78  func TestExtractBottomLines(t *testing.T) {
    79  	tests := []struct {
    80  		name    string
    81  		s       string
    82  		n       int
    83  		want    []string
    84  		wantErr bool
    85  	}{
    86  		{"Non-positive N", "Hello", 0, nil, true},
    87  		{"Empty string", "", 1, []string{}, false},
    88  		{"One line", "Hello", 1, []string{"Hello"}, false},
    89  		{"One line and newline", "Hello\n", 2, []string{"Hello"}, false},
    90  		{"Two lines 2", "Hello\nWorld", 2, []string{"Hello", "World"}, false},
    91  		{"Two lines 1", "Hello\nWorld", 1, []string{"World"}, false},
    92  		{"Two lines and newline", "Hello\nWorld\n", 2, []string{"Hello", "World"}, false},
    93  		{"Three lines with newline", "Hello\n\nWorld\n", 2, []string{"", "World"}, false},
    94  		{"All newlines", "\n\n\n", 1, []string{""}, false},
    95  		{"21 lines 1", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 1, []string{"u"}, false},
    96  		{"21 lines 2", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 2, []string{"t", "u"}, false},
    97  		{"21 lines 3", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 3, []string{"s", "t", "u"}, false},
    98  		{"21 lines 4", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 4, []string{"r", "s", "t", "u"}, false},
    99  		{"21 lines 10", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 10, []string{"l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
   100  		{"21 lines 20", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 20, []string{"b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
   101  		{"21 lines 21", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 21, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
   102  		{"21 lines 22", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", 22, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"}, false},
   103  	}
   104  	for _, tt := range tests {
   105  		t.Run(tt.name, func(t *testing.T) {
   106  			got, err := ExtractBottomLines(strings.NewReader(tt.s), tt.n)
   107  			if (err != nil) != tt.wantErr {
   108  				t.Errorf("ExtractBottomLines() error = %v, wantErr %v", err, tt.wantErr)
   109  				return
   110  			}
   111  			if !reflect.DeepEqual(got, tt.want) {
   112  				t.Errorf("ExtractBottomLines() got = %v, want %v", got, tt.want)
   113  			}
   114  		})
   115  	}
   116  }
   117  
   118  func TestExtractLastLine(t *testing.T) {
   119  	tests := []struct {
   120  		name    string
   121  		s       string
   122  		want    string
   123  		wantErr bool
   124  	}{
   125  		{"Empty string", "", "", false},
   126  		{"One line", "Hello", "Hello", false},
   127  		{"One line and newline", "Hello\n", "Hello", false},
   128  		{"Two lines", "Hello\nWorld", "World", false},
   129  		{"Two lines and newline", "Hello\nWorld\n", "World", false},
   130  		{"Three lines with newline", "Hello\n\nWorld\n", "World", false},
   131  		{"All newlines", "\n\n\n", "", false},
   132  		{"21 lines", "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np\nq\nr\ns\nt\nu\n", "u", false},
   133  	}
   134  	for _, tt := range tests {
   135  		t.Run(tt.name, func(t *testing.T) {
   136  			got, err := ExtractLastLine(strings.NewReader(tt.s))
   137  			if (err != nil) != tt.wantErr {
   138  				t.Errorf("ExtractLastLine() error = %v, wantErr %v", err, tt.wantErr)
   139  				return
   140  			}
   141  			if !reflect.DeepEqual(got, tt.want) {
   142  				t.Errorf("ExtractLastLine() got = %v, want %v", got, tt.want)
   143  			}
   144  		})
   145  	}
   146  }