github.com/vpayno/adventofcode-2022-golang-workspace@v0.0.0-20230605190011-dbafed5593de/internal/day03/app_test.go (about) 1 package day03 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 "github.com/vpayno/adventofcode-2022-golang-workspace/internal/aocshared" 9 ) 10 11 /* 12 Stdout testing code borrowed from Jon Calhoun's FizzBuzz example. 13 https://courses.calhoun.io/lessons/les_algo_m01_08 14 https://github.com/joncalhoun/algorithmswithgo.com/blob/master/module01/fizz_buzz_test.go 15 */ 16 17 // This is the main test function. This is the gatekeeper of all the tests in the appwc package. 18 func TestMain(m *testing.M) { 19 exitCode := m.Run() 20 os.Exit(exitCode) 21 } 22 23 func TestRun(t *testing.T) { 24 conf := Setup("day03") 25 26 err := Run(conf) 27 var cause string 28 if err != nil { 29 cause = err.Error() 30 } 31 assert.Nil(t, err, cause) 32 } 33 34 func TestRun_missingFile(t *testing.T) { 35 // this tests fails because it can't find the file 36 conf := Setup("day00") 37 38 err := Run(conf) 39 assert.NotNil(t, err, "Run() didn't fail with a can't find file error") 40 } 41 42 func TestRun_badData(t *testing.T) { 43 // this tests fails because some of the records are invalid 44 conf := Setup("day03") 45 46 // Give it bad data. 47 conf.inputFileName = "data/day03/day03-input-bad_data.txt" 48 49 err := Run(conf) 50 assert.NotNil(t, err, "Run() didn't fail with a bad data error") 51 } 52 53 func TestRun_badData2(t *testing.T) { 54 // this tests fails because some of the records are invalid 55 conf := Setup("day03") 56 57 // Give it bad data. 58 conf.inputFileName = "data/day03/day03-input-uneven_pockets.txt" 59 60 err := Run(conf) 61 assert.NotNil(t, err, "Run() didn't fail with an addItems() error") 62 } 63 64 func TestRun_unevenGroups(t *testing.T) { 65 // this tests fails because the not all the sack groups have 3 elves 66 conf := Setup("day03") 67 68 // Give it bad data. 69 conf.inputFileName = "data/day03/day03-input-bad_group_size.txt" 70 71 err := Run(conf) 72 assert.NotNil(t, err, "Run() didn't fail with a group size error") 73 } 74 75 func TestRun_noSharedItems(t *testing.T) { 76 // this tests fails because there are no shared items 77 conf := Setup("day03") 78 79 // Give it bad data. 80 conf.inputFileName = "data/day03/day03-input-no_shared_items.txt" 81 82 err := Run(conf) 83 assert.NotNil(t, err, "Run() didn't fail with no shared item error") 84 } 85 86 func TestLoadData(t *testing.T) { 87 wantLen := 300 88 89 fileName := "data/day03/day03-input.txt" 90 91 file, err := aocshared.GetFile(fileName) 92 assert.Nil(t, err, err) 93 94 scanner := aocshared.GetScanner(file) 95 96 got, err := loadData(scanner) 97 assert.Nil(t, err, err) 98 gotLen := len(got) 99 100 assert.Equal(t, wantLen, gotLen, "read data is the wrong size") 101 } 102 103 func TestLoadData_badFile1(t *testing.T) { 104 fileName := "data/day03/day03-input-bad_data1.txt" 105 106 file, err := aocshared.GetFile(fileName) 107 assert.Nil(t, err, err) 108 109 scanner := aocshared.GetScanner(file) 110 111 _, err = loadData(scanner) 112 assert.NotNil(t, err, err) 113 } 114 115 func TestLoadData_badFile2(t *testing.T) { 116 fileName := "data/day03/day03-input-uneven_pockets.txt" 117 118 file, err := aocshared.GetFile(fileName) 119 assert.Nil(t, err, err) 120 121 scanner := aocshared.GetScanner(file) 122 123 _, err = loadData(scanner) 124 assert.NotNil(t, err, err) 125 } 126 127 func TestGetPrioritySum(t *testing.T) { 128 sacks := rucksacks{} 129 130 r := rucksack{} 131 132 data := []string{ 133 "vJrwpWtwJgWrhcsFMMfFFhFp", 134 "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL", 135 "PmmdzqPrVvPwwTWBwg", 136 "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn", 137 "ttgJtRGJQctTZtZT", 138 "CrZsJsPPZsGzwwsLwLmpwMDw", 139 } 140 141 for _, s := range data { 142 err := r.addItems(s) 143 assert.Nil(t, err, err) 144 sacks = append(sacks, r) 145 } 146 147 want := 157 148 149 got, err := getPrioritySum(sacks) 150 assert.Nil(t, err) 151 152 assert.Equal(t, want, got) 153 } 154 155 func TestGetPrioritySum_error(t *testing.T) { 156 sacks := rucksacks{} 157 158 r := rucksack{} 159 160 data := []string{ 161 "vJrwpWtwJgWrhcsFMMfFFhFpx", 162 } 163 164 for _, s := range data { 165 err := r.addItems(s) 166 assert.NotNil(t, err, err) 167 sacks = append(sacks, r) 168 } 169 170 _, err := getPrioritySum(sacks) 171 assert.NotNil(t, err) 172 } 173 174 func TestGetGroupPrioritySum(t *testing.T) { 175 wantSackGroups := 6 176 want := 70 177 178 sacks := rucksacks{} 179 180 r := rucksack{} 181 182 data := []string{ 183 "vJrwpWtwJgWrhcsFMMfFFhFp", 184 "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL", 185 "PmmdzqPrVvPwwTWBwg", 186 "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn", 187 "ttgJtRGJQctTZtZT", 188 "CrZsJsPPZsGzwwsLwLmpwMDw", 189 } 190 191 for _, s := range data { 192 err := r.addItems(s) 193 assert.Nil(t, err, err) 194 sacks = append(sacks, r) 195 } 196 197 gotSackGroups := len(sacks) 198 assert.Equal(t, wantSackGroups, gotSackGroups) 199 200 got, err := getGroupPrioritySum(sacks) 201 assert.Nil(t, err) 202 203 assert.Equal(t, want, got) 204 } 205 206 func TestGetGroupPrioritySum_emptyList(t *testing.T) { 207 wantSackGroups := 0 208 want := 0 209 210 sacks := rucksacks{} 211 212 r := rucksack{} 213 214 data := []string{} 215 216 for _, s := range data { 217 err := r.addItems(s) 218 assert.Nil(t, err, err) 219 sacks = append(sacks, r) 220 } 221 222 gotSackGroups := len(sacks) 223 assert.Equal(t, wantSackGroups, gotSackGroups) 224 225 got, err := getGroupPrioritySum(sacks) 226 assert.NotNil(t, err) 227 228 assert.Equal(t, want, got) 229 } 230 231 func TestGetGroupPrioritySum_notDivisibleByThree(t *testing.T) { 232 wantSackGroups := 2 233 want := 0 234 235 sacks := rucksacks{} 236 237 r := rucksack{} 238 239 data := []string{ 240 "vJrwpWtwJgWrhcsFMMfFFhFp", 241 "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL", 242 } 243 244 for _, s := range data { 245 err := r.addItems(s) 246 assert.Nil(t, err, err) 247 sacks = append(sacks, r) 248 } 249 250 gotSackGroups := len(sacks) 251 assert.Equal(t, wantSackGroups, gotSackGroups) 252 253 got, err := getGroupPrioritySum(sacks) 254 assert.NotNil(t, err) 255 256 assert.Equal(t, want, got) 257 }