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  }