@@ -9,7 +9,7 @@ const data = `/->-\\
99| /-+--+-\\ |
1010| | | | v |
1111\\-+-/ \\-+--/
12- \\------/ ` . trim ( )
12+ \\------/ `
1313
1414describe ( '--- Day 13: Mine Cart Madness ---' , ( ) => {
1515 describe ( 'Part 1:' , ( ) => {
@@ -34,11 +34,143 @@ describe('--- Day 13: Mine Cart Madness ---', () => {
3434 } )
3535 } )
3636 describe ( 'advance()' , ( ) => {
37- it . skip ( 'iterates the state of the track' )
37+ it ( 'moves forward all carts on the layout' , ( ) => {
38+ const test = `/---v
39+ | | /----\\
40+ | /-+--+-\\ |
41+ | | | | | |
42+ \\-+-/ \\-+>-/
43+ \\------/ `
44+ const expected = `/---\
45+ | v /----\\
46+ | /-+--+-\\ |
47+ | | | | | |
48+ \\-+-/ \\-+->/
49+ \\------/ ` . trim ( )
50+ const track = new Track ( test )
51+ track . moveCart ( )
52+ const actual = track . display ( )
53+ expect ( actual ) . to . equal ( expected )
54+ } )
55+ } )
56+ describe ( 'moveCart(cart)' , ( ) => {
57+ it ( 'moves an individual cart right' , ( ) => {
58+ const test = `->--`
59+ const track = new Track ( test )
60+ const expected = `-->-`
61+ track . moveCart ( track . carts [ 0 ] )
62+ const actual = track . display ( )
63+ expect ( actual ) . to . equal ( expected )
64+ } )
65+ it ( 'moves an individual cart left' , ( ) => {
66+ const test = `--<-`
67+ const track = new Track ( test )
68+ const expected = `-<--`
69+ track . moveCart ( track . carts [ 0 ] )
70+ const actual = track . display ( )
71+ expect ( actual ) . to . equal ( expected )
72+ } )
73+ it ( 'moves an individual cart down' , ( ) => {
74+ const test = `|\nv\n|\n|`
75+ const track = new Track ( test )
76+ const expected = `|\n|\nv\n|`
77+ track . moveCart ( track . carts [ 0 ] )
78+ const actual = track . display ( )
79+ expect ( actual ) . to . equal ( expected )
80+ } )
81+ it ( 'moves an individual cart up' , ( ) => {
82+ const test = `|\n|\n^\n|`
83+ const track = new Track ( test )
84+ const expected = `|\n^\n|\n|`
85+ track . moveCart ( track . carts [ 0 ] )
86+ const actual = track . display ( )
87+ expect ( actual ) . to . equal ( expected )
88+ } )
89+ it ( 'rotates a cart when it enters turns' , ( ) => {
90+ const tests = [
91+ `->-\\-` ,
92+ `->-/-` ,
93+ `-/-<-` ,
94+ `-\\-<-` ,
95+ `|\nv\n|\n\\\n|` ,
96+ `|\nv\n|\n/\n|` ,
97+ `|\n/\n|\n^\n|` ,
98+ `|\n\\\n|\n^\n|`
99+ ]
100+ const expected = [
101+ `---v-` ,
102+ `---^-` ,
103+ `-v---` ,
104+ `-^---` ,
105+ `|\n|\n|\n>\n|` ,
106+ `|\n|\n|\n<\n|` ,
107+ `|\n>\n|\n|\n|` ,
108+ `|\n<\n|\n|\n|`
109+ ]
110+ tests . forEach ( ( test , idx ) => {
111+ const track = new Track ( test )
112+ track . moveCart ( track . carts [ 0 ] )
113+ track . moveCart ( track . carts [ 0 ] )
114+ const actual = track . display ( )
115+ expect ( actual ) . to . equal ( expected [ idx ] )
116+ } )
117+ } )
118+ it ( 'rotates a cart when it enters an intersection' , ( ) => {
119+ const test = `->-+-`
120+ const track = new Track ( test )
121+ const expected = `---^-`
122+ track . moveCart ( track . carts [ 0 ] )
123+ track . moveCart ( track . carts [ 0 ] )
124+ const actual = track . display ( )
125+ expect ( actual ) . to . equal ( expected )
126+ } )
127+ it ( 'tracks the direction through multiple intersections following the sequential rotation rules: left, straight, right' , ( ) => {
128+ const test = `
129+ |
130+ -+-+--
131+ |
132+ ->-+-`
133+ const track = new Track ( test )
134+ const expected = `
135+ |
136+ -+-+->
137+ |
138+ ---+-` . trim ( )
139+ for ( let i = 0 ; i < 8 ; i ++ ) {
140+ track . moveCart ( track . carts [ 0 ] )
141+ }
142+ const actual = track . display ( )
143+ expect ( actual ) . to . equal ( expected )
144+ } )
145+ it ( 'only moves the specified cart' , ( ) => {
146+ const test = `->--<-`
147+ const expected = `---><-`
148+ const track = new Track ( test )
149+ track . moveCart ( track . carts [ 0 ] )
150+ track . moveCart ( track . carts [ 0 ] )
151+ const actual = track . display ( )
152+ expect ( actual ) . to . equal ( expected )
153+ } )
154+ it ( 'throws an error if the cart runs off the rails' , ( ) => {
155+ const test = `->- -`
156+ const track = new Track ( test )
157+ track . moveCart ( track . carts [ 0 ] )
158+ expect ( track . moveCart ( track . carts [ 0 ] ) ) . to . be . an ( 'error' )
159+ } )
160+ it ( 'registers a collision' , ( ) => {
161+ const test = `->-<-`
162+ const expected = `---X-`
163+ const track = new Track ( test )
164+ track . moveCart ( track . carts [ 0 ] )
165+ track . moveCart ( track . carts [ 0 ] )
166+ const actual = track . display ( )
167+ expect ( actual ) . to . equal ( expected )
168+ expect ( track . collision ) . to . deep . equal ( { x : 3 , y : 0 } )
169+ } )
38170 } )
39171 describe ( 'display()' , ( ) => {
40172 it ( 'renders the current track state' , ( ) => {
41- const expected = data
173+ const expected = data . trim ( )
42174 const track = new Track ( data )
43175 const actual = track . display ( )
44176 expect ( actual ) . to . equal ( expected )
0 commit comments