from copy import deepcopy import numpy as np import countless2d import countless3d def test_countless2d(): def test_all_cases(fn, test_zero): case1 = np.array([ [ 1, 2 ], [ 3, 4 ] ]).reshape((2,2,1,1)) # all different case2 = np.array([ [ 1, 1 ], [ 2, 3 ] ]).reshape((2,2,1,1)) # two are same case1z = np.array([ [ 0, 1 ], [ 2, 3 ] ]).reshape((2,2,1,1)) # all different case2z = np.array([ [ 0, 0 ], [ 2, 3 ] ]).reshape((2,2,1,1)) # two are same case3 = np.array([ [ 1, 1 ], [ 2, 2 ] ]).reshape((2,2,1,1)) # two groups are same case4 = np.array([ [ 1, 2 ], [ 2, 2 ] ]).reshape((2,2,1,1)) # 3 are the same case5 = np.array([ [ 5, 5 ], [ 5, 5 ] ]).reshape((2,2,1,1)) # all are the same is_255_handled = np.array([ [ 255, 255 ], [ 1, 2 ] ], dtype=np.uint8).reshape((2,2,1,1)) test = lambda case: fn(case) if test_zero: assert test(case1z) == [[[[3]]]] # d assert test(case2z) == [[[[0]]]] # a==b else: assert test(case1) == [[[[4]]]] # d assert test(case2) == [[[[1]]]] # a==b assert test(case3) == [[[[1]]]] # a==b assert test(case4) == [[[[2]]]] # b==c assert test(case5) == [[[[5]]]] # a==b assert test(is_255_handled) == [[[[255]]]] assert fn(case1).dtype == case1.dtype test_all_cases(countless2d.simplest_countless, False) test_all_cases(countless2d.quick_countless, False) test_all_cases(countless2d.quickest_countless, False) test_all_cases(countless2d.stippled_countless, False) methods = [ countless2d.zero_corrected_countless, countless2d.countless, countless2d.countless_if, # countless2d.counting, # counting doesn't respect order so harder to write a test ] for fn in methods: print(fn.__name__) test_all_cases(fn, True) def test_stippled_countless2d(): a = np.array([ [ 1, 2 ], [ 3, 4 ] ]).reshape((2,2,1,1)) b = np.array([ [ 0, 2 ], [ 3, 4 ] ]).reshape((2,2,1,1)) c = np.array([ [ 1, 0 ], [ 3, 4 ] ]).reshape((2,2,1,1)) d = np.array([ [ 1, 2 ], [ 0, 4 ] ]).reshape((2,2,1,1)) e = np.array([ [ 1, 2 ], [ 3, 0 ] ]).reshape((2,2,1,1)) f = np.array([ [ 0, 0 ], [ 3, 4 ] ]).reshape((2,2,1,1)) g = np.array([ [ 0, 2 ], [ 0, 4 ] ]).reshape((2,2,1,1)) h = np.array([ [ 0, 2 ], [ 3, 0 ] ]).reshape((2,2,1,1)) i = np.array([ [ 1, 0 ], [ 0, 4 ] ]).reshape((2,2,1,1)) j = np.array([ [ 1, 2 ], [ 0, 0 ] ]).reshape((2,2,1,1)) k = np.array([ [ 1, 0 ], [ 3, 0 ] ]).reshape((2,2,1,1)) l = np.array([ [ 1, 0 ], [ 0, 0 ] ]).reshape((2,2,1,1)) m = np.array([ [ 0, 2 ], [ 0, 0 ] ]).reshape((2,2,1,1)) n = np.array([ [ 0, 0 ], [ 3, 0 ] ]).reshape((2,2,1,1)) o = np.array([ [ 0, 0 ], [ 0, 4 ] ]).reshape((2,2,1,1)) z = np.array([ [ 0, 0 ], [ 0, 0 ] ]).reshape((2,2,1,1)) test = countless2d.stippled_countless # Note: We only tested non-matching cases above, # cases f,g,h,i,j,k prove their duals work as well # b/c if two pixels are black, either one can be chosen # if they are different or the same. assert test(a) == [[[[4]]]] assert test(b) == [[[[4]]]] assert test(c) == [[[[4]]]] assert test(d) == [[[[4]]]] assert test(e) == [[[[1]]]] assert test(f) == [[[[4]]]] assert test(g) == [[[[4]]]] assert test(h) == [[[[2]]]] assert test(i) == [[[[4]]]] assert test(j) == [[[[1]]]] assert test(k) == [[[[1]]]] assert test(l) == [[[[1]]]] assert test(m) == [[[[2]]]] assert test(n) == [[[[3]]]] assert test(o) == [[[[4]]]] assert test(z) == [[[[0]]]] bc = np.array([ [ 0, 2 ], [ 2, 4 ] ]).reshape((2,2,1,1)) bd = np.array([ [ 0, 2 ], [ 3, 2 ] ]).reshape((2,2,1,1)) cd = np.array([ [ 0, 2 ], [ 3, 3 ] ]).reshape((2,2,1,1)) assert test(bc) == [[[[2]]]] assert test(bd) == [[[[2]]]] assert test(cd) == [[[[3]]]] ab = np.array([ [ 1, 1 ], [ 0, 4 ] ]).reshape((2,2,1,1)) ac = np.array([ [ 1, 2 ], [ 1, 0 ] ]).reshape((2,2,1,1)) ad = np.array([ [ 1, 0 ], [ 3, 1 ] ]).reshape((2,2,1,1)) assert test(ab) == [[[[1]]]] assert test(ac) == [[[[1]]]] assert test(ad) == [[[[1]]]] def test_countless3d(): def test_all_cases(fn): alldifferent = [ [ [1,2], [3,4], ], [ [5,6], [7,8] ] ] allsame = [ [ [1,1], [1,1], ], [ [1,1], [1,1] ] ] assert fn(np.array(alldifferent)) == [[[8]]] assert fn(np.array(allsame)) == [[[1]]] twosame = deepcopy(alldifferent) twosame[1][1][0] = 2 assert fn(np.array(twosame)) == [[[2]]] threemixed = [ [ [3,3], [1,2], ], [ [2,4], [4,3] ] ] assert fn(np.array(threemixed)) == [[[3]]] foursame = [ [ [4,4], [1,2], ], [ [2,4], [4,3] ] ] assert fn(np.array(foursame)) == [[[4]]] fivesame = [ [ [5,4], [5,5], ], [ [2,4], [5,5] ] ] assert fn(np.array(fivesame)) == [[[5]]] def countless3d_generalized(img): return countless3d.countless_generalized(img, (2,2,2)) def countless3d_dynamic_generalized(img): return countless3d.dynamic_countless_generalized(img, (2,2,2)) methods = [ countless3d.countless3d, countless3d.dynamic_countless3d, countless3d_generalized, countless3d_dynamic_generalized, ] for fn in methods: test_all_cases(fn)