if __FILE__ == $0 require 'test/unit' class TestTreeFind < Test::Unit::TestCase def test_flat assert_equal(2, treefind([1,2,3,4]) {|v| v % 3 == 2 }) assert_equal("perl", treefind(["ruby", "perl", "python", "php", "lisp"]) {|v| /^p/ =~ v }) end def test_string assert_equal(nil, treefind(["a\nb\n"]) {|v| v == "a\n" }) end def test_nest assert_equal(2, treefind([[1,2],[3,[4,5]],6]) {|v| v % 3 == 2 }) end def test_not_found assert_equal(nil, treefind([[1,2],[3,[4,5]],6]) {|v| v == 10 }) end def test_nil assert_equal(nil, treefind([1,2,3,nil,4,5,6]) {|v| v == nil }) assert_equal(nil, treefind([1,2,3,nil,4,5,6]) {|v| v == nil || v == 5 }) assert_equal(nil, treefind([[1,2,3,nil,4,5,6]]) {|v| v == nil || v == 5 }) assert_equal(nil, treefind([[nil],5]) {|v| v == nil || v == 5 }) end def test_false assert_equal(false, treefind([1,2,3,false,4,5,6]) {|v| v == false }) assert_equal(false, treefind([1,2,3,false,4,5,6]) {|v| v == false || v == 5 }) assert_equal(false, treefind([[1,2,3,false,4,5,6]]) {|v| v == false || v == 5 }) assert_equal(false, treefind([[false],5]) {|v| v == false || v == 5 }) end end end def tree_each(obj, &b) if obj.respond_to? :to_ary obj.each {|v| tree_each(v, &b) } else yield obj end end def treefind(ary) tree_each(ary) {|v| return v if yield v } nil end