USING: accessors arrays classes deques dlists kernel locals math tools.test ; IN: dlists.tests [ t ] [ deque-empty? ] unit-test [ T{ dlist f T{ dlist-node f f f 1 } T{ dlist-node f f f 1 } } ] [ 1 over push-front ] unit-test ! Make sure empty lists are empty [ t ] [ deque-empty? ] unit-test [ f ] [ 1 over push-front deque-empty? ] unit-test [ f ] [ 1 over push-back deque-empty? ] unit-test [ 1 ] [ 1 over push-front pop-front ] unit-test [ 1 ] [ 1 over push-front pop-back ] unit-test [ 1 ] [ 1 over push-back pop-front ] unit-test [ 1 ] [ 1 over push-back pop-back ] unit-test [ T{ dlist f f f } ] [ 1 over push-front dup pop-front* ] unit-test [ T{ dlist f f f } ] [ 1 over push-front dup pop-back* ] unit-test [ T{ dlist f f f } ] [ 1 over push-back dup pop-front* ] unit-test [ T{ dlist f f f } ] [ 1 over push-back dup pop-back* ] unit-test ! Test the prev,next links for two nodes [ f ] [ 1 over push-back 2 over push-back front>> prev>> ] unit-test [ 2 ] [ 1 over push-back 2 over push-back front>> next>> obj>> ] unit-test [ 1 ] [ 1 over push-back 2 over push-back front>> next>> prev>> obj>> ] unit-test [ f ] [ 1 over push-back 2 over push-back front>> next>> next>> ] unit-test [ f f ] [ [ 1 = ] dlist-find ] unit-test [ 1 t ] [ 1 over push-back [ 1 = ] dlist-find ] unit-test [ f f ] [ 1 over push-back [ 2 = ] dlist-find ] unit-test [ f ] [ 1 over push-back [ 2 = ] dlist-any? ] unit-test [ t ] [ 1 over push-back [ 1 = ] dlist-any? ] unit-test [ 1 ] [ 1 over push-back [ 1 = ] delete-node-if ] unit-test [ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test [ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test [ t ] [ 4 over push-back 5 over push-back [ obj>> 4 = ] dlist-find-node class-of dlist-node = ] unit-test [ t ] [ 4 over push-back 5 over push-back [ obj>> 5 = ] dlist-find-node class-of dlist-node = ] unit-test [ t ] [ 4 over push-back 5 over push-back* [ = ] curry dlist-find-node class-of dlist-node = ] unit-test [ ] [ 4 over push-back 5 over push-back [ drop ] dlist-each ] unit-test [ f ] [ ?peek-front ] unit-test [ 1 ] [ 1 over push-front ?peek-front ] unit-test [ f ] [ ?peek-back ] unit-test [ 1 ] [ 1 over push-back ?peek-back ] unit-test [ peek-front ] [ empty-deque? ] must-fail-with [ peek-back ] [ empty-deque? ] must-fail-with [ pop-front ] [ empty-deque? ] must-fail-with [ pop-back ] [ empty-deque? ] must-fail-with [ t ] [ 3 over push-front 4 over push-back 3 swap deque-member? ] unit-test [ f ] [ 3 over push-front 4 over push-back -1 swap deque-member? ] unit-test [ f ] [ 0 swap deque-member? ] unit-test ! Make sure clone does the right thing [ V{ 2 1 } V{ 2 1 3 } ] [ 1 over push-front 2 over push-front dup clone 3 over push-back [ dlist>sequence ] bi@ ] unit-test [ V{ f 3 1 f } ] [ 1 over push-front 3 over push-front f over push-front f over push-back dlist>sequence ] unit-test [ V{ } ] [ dlist>sequence ] unit-test [ V{ 0 2 4 } ] [ { 0 1 2 3 4 } over push-all-back [ even? ] dlist-filter dlist>sequence ] unit-test [ V{ 2 4 } ] [ { 1 2 3 4 } over push-all-back [ even? ] dlist-filter dlist>sequence ] unit-test [ V{ 2 4 } ] [ { 1 2 3 4 5 } over push-all-back [ even? ] dlist-filter dlist>sequence ] unit-test [ V{ 0 2 4 } ] [ { 0 1 2 3 4 5 } over push-all-back [ even? ] dlist-filter dlist>sequence ] unit-test [ t ] [ DL{ } DL{ } = ] unit-test [ t ] [ DL{ 1 } DL{ 1 } = ] unit-test [ t ] [ DL{ 1 2 } DL{ 1 2 } = ] unit-test [ t ] [ DL{ 1 1 } DL{ 1 1 } = ] unit-test [ f ] [ DL{ 1 2 3 } DL{ 1 2 } = ] unit-test [ f ] [ DL{ 1 2 } DL{ 1 2 3 } = ] unit-test [ f ] [ DL{ } DL{ 1 } = ] unit-test [ f ] [ DL{ f } DL{ 1 } = ] unit-test [ f ] [ f DL{ } = ] unit-test [ f ] [ DL{ } f = ] unit-test TUPLE: my-node < dlist-link { obj fixnum } ; : ( obj -- node ) my-node new swap >>obj ; inline [ V{ 1 } ] [ 1 over push-node-front dlist>sequence ] unit-test [ V{ 2 1 } ] [ 1 over push-node-front 2 over push-node-front dlist>sequence ] unit-test [ V{ 1 } ] [ 1 over push-node-back dlist>sequence ] unit-test [ V{ 1 2 } ] [ 1 over push-node-back 2 over push-node-back dlist>sequence ] unit-test [ V{ 1 2 3 } ] [ 1 over push-node-back 2 over push-node-back 3 over push-node-back dlist>sequence ] unit-test : assert-links ( dlist-node -- ) [ prev>> ] [ next>> ] bi 2array { f f } assert= ; [ V{ } ] [ 1 over push-node-back [ [ back>> ] [ ] bi delete-node ] [ ] bi dlist>sequence ] unit-test [ V{ 1 2 } t ] [| | :> dl 1 :> n1 n1 dl push-node-back 2 :> n2 n2 dl push-node-back 3 :> n3 n3 dl push-node-back n3 dl delete-node n3 assert-links dl dlist>sequence dup >dlist dl = ] unit-test [ V{ 1 3 } t ] [| | :> dl 1 :> n1 n1 dl push-node-back 2 :> n2 n2 dl push-node-back 3 :> n3 n3 dl push-node-back n2 dl delete-node n2 assert-links dl dlist>sequence dup >dlist dl = ] unit-test [ V{ 2 3 } t ] [| | :> dl 1 :> n1 n1 dl push-node-back 2 :> n2 n2 dl push-node-back 3 :> n3 n3 dl push-node-back n1 dl delete-node n1 assert-links dl dlist>sequence dup >dlist dl = ] unit-test