mirror of
https://github.com/arsenetar/dupeguru.git
synced 2024-11-18 04:59:03 +00:00
838f8ae352
--HG-- rename : base/cocoa/AppDelegate.h => cocoa/base/AppDelegate.h rename : base/cocoa/AppDelegate.m => cocoa/base/AppDelegate.m rename : base/cocoa/Consts.h => cocoa/base/Consts.h rename : base/cocoa/DetailsPanel.h => cocoa/base/DetailsPanel.h rename : base/cocoa/DetailsPanel.m => cocoa/base/DetailsPanel.m rename : base/cocoa/DirectoryPanel.h => cocoa/base/DirectoryPanel.h rename : base/cocoa/DirectoryPanel.m => cocoa/base/DirectoryPanel.m rename : base/cocoa/PyDupeGuru.h => cocoa/base/PyDupeGuru.h rename : base/cocoa/ResultWindow.h => cocoa/base/ResultWindow.h rename : base/cocoa/ResultWindow.m => cocoa/base/ResultWindow.m rename : base/cocoa/dsa_pub.pem => cocoa/base/dsa_pub.pem rename : base/cocoa/xib/DetailsPanel.xib => cocoa/base/xib/DetailsPanel.xib rename : base/cocoa/xib/DirectoryPanel.xib => cocoa/base/xib/DirectoryPanel.xib rename : base/cocoa/xib/MainMenu.xib => cocoa/base/xib/MainMenu.xib rename : me/cocoa/AppDelegate.h => cocoa/me/AppDelegate.h rename : me/cocoa/AppDelegate.m => cocoa/me/AppDelegate.m rename : me/cocoa/Consts.h => cocoa/me/Consts.h rename : me/cocoa/DetailsPanel.h => cocoa/me/DetailsPanel.h rename : me/cocoa/DetailsPanel.m => cocoa/me/DetailsPanel.m rename : me/cocoa/DirectoryPanel.h => cocoa/me/DirectoryPanel.h rename : me/cocoa/DirectoryPanel.m => cocoa/me/DirectoryPanel.m rename : me/cocoa/Info.plist => cocoa/me/Info.plist rename : me/cocoa/PyDupeGuru.h => cocoa/me/PyDupeGuru.h rename : me/cocoa/ResultWindow.h => cocoa/me/ResultWindow.h rename : me/cocoa/ResultWindow.m => cocoa/me/ResultWindow.m rename : me/cocoa/dupeguru.icns => cocoa/me/dupeguru.icns rename : me/cocoa/dupeguru.xcodeproj/project.pbxproj => cocoa/me/dupeguru.xcodeproj/project.pbxproj rename : me/cocoa/gen.py => cocoa/me/gen.py rename : me/cocoa/main.m => cocoa/me/main.m rename : me/cocoa/py/dg_cocoa.py => cocoa/me/py/dg_cocoa.py rename : me/cocoa/py/setup.py => cocoa/me/py/setup.py rename : me/cocoa/xib/Preferences.xib => cocoa/me/xib/Preferences.xib rename : pe/cocoa/AppDelegate.h => cocoa/pe/AppDelegate.h rename : pe/cocoa/AppDelegate.m => cocoa/pe/AppDelegate.m rename : pe/cocoa/Consts.h => cocoa/pe/Consts.h rename : pe/cocoa/DetailsPanel.h => cocoa/pe/DetailsPanel.h rename : pe/cocoa/DetailsPanel.m => cocoa/pe/DetailsPanel.m rename : pe/cocoa/DirectoryPanel.h => cocoa/pe/DirectoryPanel.h rename : pe/cocoa/DirectoryPanel.m => cocoa/pe/DirectoryPanel.m rename : pe/cocoa/Info.plist => cocoa/pe/Info.plist rename : pe/cocoa/PictureBlocks.h => cocoa/pe/PictureBlocks.h rename : pe/cocoa/PictureBlocks.m => cocoa/pe/PictureBlocks.m rename : pe/cocoa/PyDupeGuru.h => cocoa/pe/PyDupeGuru.h rename : pe/cocoa/ResultWindow.h => cocoa/pe/ResultWindow.h rename : pe/cocoa/ResultWindow.m => cocoa/pe/ResultWindow.m rename : pe/cocoa/dupeguru.icns => cocoa/pe/dupeguru.icns rename : pe/cocoa/dupeguru.xcodeproj/project.pbxproj => cocoa/pe/dupeguru.xcodeproj/project.pbxproj rename : pe/cocoa/gen.py => cocoa/pe/gen.py rename : pe/cocoa/main.m => cocoa/pe/main.m rename : pe/cocoa/py/dg_cocoa.py => cocoa/pe/py/dg_cocoa.py rename : pe/cocoa/py/setup.py => cocoa/pe/py/setup.py rename : pe/cocoa/xib/DetailsPanel.xib => cocoa/pe/xib/DetailsPanel.xib rename : pe/cocoa/xib/Preferences.xib => cocoa/pe/xib/Preferences.xib rename : se/cocoa/AppDelegate.h => cocoa/se/AppDelegate.h rename : se/cocoa/AppDelegate.m => cocoa/se/AppDelegate.m rename : se/cocoa/Consts.h => cocoa/se/Consts.h rename : se/cocoa/DetailsPanel.h => cocoa/se/DetailsPanel.h rename : se/cocoa/DetailsPanel.m => cocoa/se/DetailsPanel.m rename : se/cocoa/DirectoryPanel.h => cocoa/se/DirectoryPanel.h rename : se/cocoa/DirectoryPanel.m => cocoa/se/DirectoryPanel.m rename : se/cocoa/Info.plist => cocoa/se/Info.plist rename : se/cocoa/PyDupeGuru.h => cocoa/se/PyDupeGuru.h rename : se/cocoa/ResultWindow.h => cocoa/se/ResultWindow.h rename : se/cocoa/ResultWindow.m => cocoa/se/ResultWindow.m rename : se/cocoa/dupeguru.icns => cocoa/se/dupeguru.icns rename : se/cocoa/dupeguru.xcodeproj/project.pbxproj => cocoa/se/dupeguru.xcodeproj/project.pbxproj rename : se/cocoa/gen.py => cocoa/se/gen.py rename : se/cocoa/main.m => cocoa/se/main.m rename : se/cocoa/py/dg_cocoa.py => cocoa/se/py/dg_cocoa.py rename : se/cocoa/py/setup.py => cocoa/se/py/setup.py rename : se/cocoa/xib/Preferences.xib => cocoa/se/xib/Preferences.xib rename : base/core/LICENSE => core/LICENSE rename : base/core/__init__.py => core/__init__.py rename : base/core/app.py => core/app.py rename : base/core/app_cocoa.py => core/app_cocoa.py rename : base/core/data.py => core/data.py rename : base/core/directories.py => core/directories.py rename : base/core/engine.py => core/engine.py rename : base/core/export.py => core/export.py rename : base/core/fs.py => core/fs.py rename : base/core/ignore.py => core/ignore.py rename : base/core/results.py => core/results.py rename : base/core/scanner.py => core/scanner.py rename : base/core/tests/__init__.py => core/tests/__init__.py rename : base/core/tests/app_cocoa_test.py => core/tests/app_cocoa_test.py rename : base/core/tests/app_test.py => core/tests/app_test.py rename : base/core/tests/data.py => core/tests/data.py rename : base/core/tests/directories_test.py => core/tests/directories_test.py rename : base/core/tests/engine_test.py => core/tests/engine_test.py rename : base/core/tests/ignore_test.py => core/tests/ignore_test.py rename : base/core/tests/results_test.py => core/tests/results_test.py rename : base/core/tests/scanner_test.py => core/tests/scanner_test.py rename : me/core/__init__.py => core_me/__init__.py rename : me/core/app_cocoa.py => core_me/app_cocoa.py rename : me/core/data.py => core_me/data.py rename : me/core/fs.py => core_me/fs.py rename : me/core/scanner.py => core_me/scanner.py rename : me/core/tests/__init__.py => core_me/tests/__init__.py rename : me/core/tests/scanner_test.py => core_me/tests/scanner_test.py rename : pe/core/LICENSE => core_pe/LICENSE rename : pe/core/__init__.py => core_pe/__init__.py rename : pe/core/app_cocoa.py => core_pe/app_cocoa.py rename : pe/core/block.py => core_pe/block.py rename : pe/core/cache.py => core_pe/cache.py rename : pe/core/data.py => core_pe/data.py rename : pe/core/gen.py => core_pe/gen.py rename : pe/core/matchbase.py => core_pe/matchbase.py rename : pe/core/modules/block/block.pyx => core_pe/modules/block/block.pyx rename : pe/core/modules/block/setup.py => core_pe/modules/block/setup.py rename : pe/core/modules/cache/cache.pyx => core_pe/modules/cache/cache.pyx rename : pe/core/modules/cache/setup.py => core_pe/modules/cache/setup.py rename : pe/core/scanner.py => core_pe/scanner.py rename : pe/core/tests/__init__.py => core_pe/tests/__init__.py rename : pe/core/tests/block_test.py => core_pe/tests/block_test.py rename : pe/core/tests/cache_test.py => core_pe/tests/cache_test.py rename : se/core/LICENSE => core_se/LICENSE rename : se/core/__init__.py => core_se/__init__.py rename : se/core/app_cocoa.py => core_se/app_cocoa.py rename : se/core/data.py => core_se/data.py rename : se/core/fs.py => core_se/fs.py rename : se/core/tests/__init__.py => core_se/tests/__init__.py rename : se/core/tests/fs_test.py => core_se/tests/fs_test.py rename : me/help/LICENSE => help_me/LICENSE rename : me/help/__init__.py => help_me/__init__.py rename : me/help/changelog.yaml => help_me/changelog.yaml rename : me/help/gen.py => help_me/gen.py rename : me/help/skeleton/hardcoded.css => help_me/skeleton/hardcoded.css rename : me/help/skeleton/images/hs_title.png => help_me/skeleton/images/hs_title.png rename : me/help/templates/base_dg.mako => help_me/templates/base_dg.mako rename : me/help/templates/credits.mako => help_me/templates/credits.mako rename : me/help/templates/directories.mako => help_me/templates/directories.mako rename : me/help/templates/faq.mako => help_me/templates/faq.mako rename : me/help/templates/intro.mako => help_me/templates/intro.mako rename : me/help/templates/power_marker.mako => help_me/templates/power_marker.mako rename : me/help/templates/preferences.mako => help_me/templates/preferences.mako rename : me/help/templates/quick_start.mako => help_me/templates/quick_start.mako rename : me/help/templates/results.mako => help_me/templates/results.mako rename : me/help/templates/versions.mako => help_me/templates/versions.mako rename : pe/help/LICENSE => help_pe/LICENSE rename : pe/help/__init__.py => help_pe/__init__.py rename : pe/help/changelog.yaml => help_pe/changelog.yaml rename : pe/help/gen.py => help_pe/gen.py rename : pe/help/skeleton/hardcoded.css => help_pe/skeleton/hardcoded.css rename : pe/help/skeleton/images/hs_title.png => help_pe/skeleton/images/hs_title.png rename : pe/help/templates/base_dg.mako => help_pe/templates/base_dg.mako rename : pe/help/templates/credits.mako => help_pe/templates/credits.mako rename : pe/help/templates/directories.mako => help_pe/templates/directories.mako rename : pe/help/templates/faq.mako => help_pe/templates/faq.mako rename : pe/help/templates/intro.mako => help_pe/templates/intro.mako rename : pe/help/templates/power_marker.mako => help_pe/templates/power_marker.mako rename : pe/help/templates/preferences.mako => help_pe/templates/preferences.mako rename : pe/help/templates/quick_start.mako => help_pe/templates/quick_start.mako rename : pe/help/templates/results.mako => help_pe/templates/results.mako rename : pe/help/templates/versions.mako => help_pe/templates/versions.mako rename : se/help/LICENSE => help_se/LICENSE rename : se/help/changelog.yaml => help_se/changelog.yaml rename : se/help/gen.py => help_se/gen.py rename : se/help/skeleton/hardcoded.css => help_se/skeleton/hardcoded.css rename : se/help/skeleton/images/hs_title.png => help_se/skeleton/images/hs_title.png rename : se/help/templates/base_dg.mako => help_se/templates/base_dg.mako rename : se/help/templates/credits.mako => help_se/templates/credits.mako rename : se/help/templates/directories.mako => help_se/templates/directories.mako rename : se/help/templates/faq.mako => help_se/templates/faq.mako rename : se/help/templates/intro.mako => help_se/templates/intro.mako rename : se/help/templates/power_marker.mako => help_se/templates/power_marker.mako rename : se/help/templates/preferences.mako => help_se/templates/preferences.mako rename : se/help/templates/quick_start.mako => help_se/templates/quick_start.mako rename : se/help/templates/results.mako => help_se/templates/results.mako rename : se/help/templates/versions.mako => help_se/templates/versions.mako rename : base/qt/WARNING => qt/WARNING rename : base/qt/__init__.py => qt/base/__init__.py rename : base/qt/app.py => qt/base/app.py rename : base/qt/details_table.py => qt/base/details_table.py rename : base/qt/dg.qrc => qt/base/dg.qrc rename : base/qt/directories_dialog.py => qt/base/directories_dialog.py rename : base/qt/directories_dialog.ui => qt/base/directories_dialog.ui rename : base/qt/directories_model.py => qt/base/directories_model.py rename : base/qt/main_window.py => qt/base/main_window.py rename : base/qt/main_window.ui => qt/base/main_window.ui rename : base/qt/platform.py => qt/base/platform.py rename : base/qt/platform_osx.py => qt/base/platform_osx.py rename : base/qt/platform_win.py => qt/base/platform_win.py rename : base/qt/preferences.py => qt/base/preferences.py rename : base/qt/results_model.py => qt/base/results_model.py rename : me/qt/app.py => qt/me/app.py rename : me/qt/build.py => qt/me/build.py rename : me/qt/details_dialog.py => qt/me/details_dialog.py rename : me/qt/details_dialog.ui => qt/me/details_dialog.ui rename : me/qt/dgme.spec => qt/me/dgme.spec rename : me/qt/gen.py => qt/me/gen.py rename : me/qt/installer.aip => qt/me/installer.aip rename : me/qt/preferences.py => qt/me/preferences.py rename : me/qt/preferences_dialog.py => qt/me/preferences_dialog.py rename : me/qt/preferences_dialog.ui => qt/me/preferences_dialog.ui rename : me/qt/profile.py => qt/me/profile.py rename : me/qt/start.py => qt/me/start.py rename : me/qt/verinfo => qt/me/verinfo rename : pe/qt/app.py => qt/pe/app.py rename : pe/qt/block.py => qt/pe/block.py rename : pe/qt/build.py => qt/pe/build.py rename : pe/qt/details_dialog.py => qt/pe/details_dialog.py rename : pe/qt/details_dialog.ui => qt/pe/details_dialog.ui rename : pe/qt/dgpe.spec => qt/pe/dgpe.spec rename : pe/qt/gen.py => qt/pe/gen.py rename : pe/qt/installer.aip => qt/pe/installer.aip rename : pe/qt/main_window.py => qt/pe/main_window.py rename : pe/qt/modules/block/block.pyx => qt/pe/modules/block/block.pyx rename : pe/qt/modules/block/setup.py => qt/pe/modules/block/setup.py rename : pe/qt/preferences.py => qt/pe/preferences.py rename : pe/qt/preferences_dialog.py => qt/pe/preferences_dialog.py rename : pe/qt/preferences_dialog.ui => qt/pe/preferences_dialog.ui rename : pe/qt/profile.py => qt/pe/profile.py rename : pe/qt/start.py => qt/pe/start.py rename : pe/qt/verinfo => qt/pe/verinfo rename : se/qt/app.py => qt/se/app.py rename : se/qt/build.py => qt/se/build.py rename : se/qt/details_dialog.py => qt/se/details_dialog.py rename : se/qt/details_dialog.ui => qt/se/details_dialog.ui rename : se/qt/dgse.spec => qt/se/dgse.spec rename : se/qt/gen.py => qt/se/gen.py rename : se/qt/installer.aip => qt/se/installer.aip rename : se/qt/preferences.py => qt/se/preferences.py rename : se/qt/preferences_dialog.py => qt/se/preferences_dialog.py rename : se/qt/preferences_dialog.ui => qt/se/preferences_dialog.ui rename : se/qt/profile.py => qt/se/profile.py rename : se/qt/start.py => qt/se/start.py rename : se/qt/verinfo => qt/se/verinfo extra : convert_revision : svn%3Ac306627e-7827-47d3-bdf0-9a457c9553a1/trunk%40285
309 lines
10 KiB
Python
309 lines
10 KiB
Python
# Created By: Virgil Dupras
|
|
# Created On: 2006/09/01
|
|
# $Id$
|
|
# Copyright 2009 Hardcoded Software (http://www.hardcoded.net)
|
|
#
|
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
# which should be included with this package. The terms are also available at
|
|
# http://www.hardcoded.net/licenses/hs_license
|
|
# The commented out tests are tests for function that have been converted to pure C for speed
|
|
|
|
import unittest
|
|
|
|
from ..block import *
|
|
|
|
def my_avgdiff(first, second, limit=768, min_iter=3): # this is so I don't have to re-write every call
|
|
return avgdiff(first, second, limit, min_iter)
|
|
|
|
BLACK = (0,0,0)
|
|
RED = (0xff,0,0)
|
|
GREEN = (0,0xff,0)
|
|
BLUE = (0,0,0xff)
|
|
|
|
class FakeImage(object):
|
|
def __init__(self, size, data):
|
|
self.size = size
|
|
self.data = data
|
|
|
|
def getdata(self):
|
|
return self.data
|
|
|
|
def crop(self, box):
|
|
pixels = []
|
|
for i in range(box[1], box[3]):
|
|
for j in range(box[0], box[2]):
|
|
pixel = self.data[i * self.size[0] + j]
|
|
pixels.append(pixel)
|
|
return FakeImage((box[2] - box[0], box[3] - box[1]), pixels)
|
|
|
|
def empty():
|
|
return FakeImage((0,0), [])
|
|
|
|
def single_pixel(): #one red pixel
|
|
return FakeImage((1, 1), [(0xff,0,0)])
|
|
|
|
def four_pixels():
|
|
pixels = [RED,(0,0x80,0xff),(0x80,0,0),(0,0x40,0x80)]
|
|
return FakeImage((2, 2), pixels)
|
|
|
|
class TCgetblock(unittest.TestCase):
|
|
def test_single_pixel(self):
|
|
im = single_pixel()
|
|
[b] = getblocks2(im, 1)
|
|
self.assertEqual(RED,b)
|
|
|
|
def test_no_pixel(self):
|
|
im = empty()
|
|
self.assertEqual([], getblocks2(im, 1))
|
|
|
|
def test_four_pixels(self):
|
|
im = four_pixels()
|
|
[b] = getblocks2(im, 1)
|
|
meanred = (0xff + 0x80) // 4
|
|
meangreen = (0x80 + 0x40) // 4
|
|
meanblue = (0xff + 0x80) // 4
|
|
self.assertEqual((meanred,meangreen,meanblue),b)
|
|
|
|
|
|
# class TCdiff(unittest.TestCase):
|
|
# def test_diff(self):
|
|
# b1 = (10, 20, 30)
|
|
# b2 = (1, 2, 3)
|
|
# self.assertEqual(9 + 18 + 27,diff(b1,b2))
|
|
#
|
|
# def test_diff_negative(self):
|
|
# b1 = (10, 20, 30)
|
|
# b2 = (1, 2, 3)
|
|
# self.assertEqual(9 + 18 + 27,diff(b2,b1))
|
|
#
|
|
# def test_diff_mixed_positive_and_negative(self):
|
|
# b1 = (1, 5, 10)
|
|
# b2 = (10, 1, 15)
|
|
# self.assertEqual(9 + 4 + 5,diff(b1,b2))
|
|
#
|
|
|
|
# class TCgetblocks(unittest.TestCase):
|
|
# def test_empty_image(self):
|
|
# im = empty()
|
|
# blocks = getblocks(im,1)
|
|
# self.assertEqual(0,len(blocks))
|
|
#
|
|
# def test_one_block_image(self):
|
|
# im = four_pixels()
|
|
# blocks = getblocks2(im, 1)
|
|
# self.assertEqual(1,len(blocks))
|
|
# block = blocks[0]
|
|
# meanred = (0xff + 0x80) // 4
|
|
# meangreen = (0x80 + 0x40) // 4
|
|
# meanblue = (0xff + 0x80) // 4
|
|
# self.assertEqual((meanred,meangreen,meanblue),block)
|
|
#
|
|
# def test_not_enough_height_to_fit_a_block(self):
|
|
# im = FakeImage((2,1), [BLACK, BLACK])
|
|
# blocks = getblocks(im,2)
|
|
# self.assertEqual(0,len(blocks))
|
|
#
|
|
# def xtest_dont_include_leftovers(self):
|
|
# # this test is disabled because getblocks is not used and getblock in cdeffed
|
|
# pixels = [
|
|
# RED,(0,0x80,0xff),BLACK,
|
|
# (0x80,0,0),(0,0x40,0x80),BLACK,
|
|
# BLACK,BLACK,BLACK
|
|
# ]
|
|
# im = FakeImage((3,3), pixels)
|
|
# blocks = getblocks(im,2)
|
|
# block = blocks[0]
|
|
# #Because the block is smaller than the image, only blocksize must be considered.
|
|
# meanred = (0xff + 0x80) // 4
|
|
# meangreen = (0x80 + 0x40) // 4
|
|
# meanblue = (0xff + 0x80) // 4
|
|
# self.assertEqual((meanred,meangreen,meanblue),block)
|
|
#
|
|
# def xtest_two_blocks(self):
|
|
# # this test is disabled because getblocks is not used and getblock in cdeffed
|
|
# pixels = [BLACK for i in xrange(4 * 2)]
|
|
# pixels[0] = RED
|
|
# pixels[1] = (0,0x80,0xff)
|
|
# pixels[4] = (0x80,0,0)
|
|
# pixels[5] = (0,0x40,0x80)
|
|
# im = FakeImage((4, 2), pixels)
|
|
# blocks = getblocks(im,2)
|
|
# self.assertEqual(2,len(blocks))
|
|
# block = blocks[0]
|
|
# #Because the block is smaller than the image, only blocksize must be considered.
|
|
# meanred = (0xff + 0x80) // 4
|
|
# meangreen = (0x80 + 0x40) // 4
|
|
# meanblue = (0xff + 0x80) // 4
|
|
# self.assertEqual((meanred,meangreen,meanblue),block)
|
|
# self.assertEqual(BLACK,blocks[1])
|
|
#
|
|
# def test_four_blocks(self):
|
|
# pixels = [BLACK for i in xrange(4 * 4)]
|
|
# pixels[0] = RED
|
|
# pixels[1] = (0,0x80,0xff)
|
|
# pixels[4] = (0x80,0,0)
|
|
# pixels[5] = (0,0x40,0x80)
|
|
# im = FakeImage((4, 4), pixels)
|
|
# blocks = getblocks2(im, 2)
|
|
# self.assertEqual(4,len(blocks))
|
|
# block = blocks[0]
|
|
# #Because the block is smaller than the image, only blocksize must be considered.
|
|
# meanred = (0xff + 0x80) // 4
|
|
# meangreen = (0x80 + 0x40) // 4
|
|
# meanblue = (0xff + 0x80) // 4
|
|
# self.assertEqual((meanred,meangreen,meanblue),block)
|
|
# self.assertEqual(BLACK,blocks[1])
|
|
# self.assertEqual(BLACK,blocks[2])
|
|
# self.assertEqual(BLACK,blocks[3])
|
|
#
|
|
|
|
class TCgetblocks2(unittest.TestCase):
|
|
def test_empty_image(self):
|
|
im = empty()
|
|
blocks = getblocks2(im,1)
|
|
self.assertEqual(0,len(blocks))
|
|
|
|
def test_one_block_image(self):
|
|
im = four_pixels()
|
|
blocks = getblocks2(im,1)
|
|
self.assertEqual(1,len(blocks))
|
|
block = blocks[0]
|
|
meanred = (0xff + 0x80) // 4
|
|
meangreen = (0x80 + 0x40) // 4
|
|
meanblue = (0xff + 0x80) // 4
|
|
self.assertEqual((meanred,meangreen,meanblue),block)
|
|
|
|
def test_four_blocks_all_black(self):
|
|
im = FakeImage((2, 2), [BLACK, BLACK, BLACK, BLACK])
|
|
blocks = getblocks2(im,2)
|
|
self.assertEqual(4,len(blocks))
|
|
for block in blocks:
|
|
self.assertEqual(BLACK,block)
|
|
|
|
def test_two_pixels_image_horizontal(self):
|
|
pixels = [RED,BLUE]
|
|
im = FakeImage((2, 1), pixels)
|
|
blocks = getblocks2(im,2)
|
|
self.assertEqual(4,len(blocks))
|
|
self.assertEqual(RED,blocks[0])
|
|
self.assertEqual(BLUE,blocks[1])
|
|
self.assertEqual(RED,blocks[2])
|
|
self.assertEqual(BLUE,blocks[3])
|
|
|
|
def test_two_pixels_image_vertical(self):
|
|
pixels = [RED,BLUE]
|
|
im = FakeImage((1, 2), pixels)
|
|
blocks = getblocks2(im,2)
|
|
self.assertEqual(4,len(blocks))
|
|
self.assertEqual(RED,blocks[0])
|
|
self.assertEqual(RED,blocks[1])
|
|
self.assertEqual(BLUE,blocks[2])
|
|
self.assertEqual(BLUE,blocks[3])
|
|
|
|
|
|
class TCavgdiff(unittest.TestCase):
|
|
def test_empty(self):
|
|
self.assertRaises(NoBlocksError, my_avgdiff, [], [])
|
|
|
|
def test_two_blocks(self):
|
|
im = empty()
|
|
b1 = (5,10,15)
|
|
b2 = (255,250,245)
|
|
b3 = (0,0,0)
|
|
b4 = (255,0,255)
|
|
blocks1 = [b1,b2]
|
|
blocks2 = [b3,b4]
|
|
expected1 = 5 + 10 + 15
|
|
expected2 = 0 + 250 + 10
|
|
expected = (expected1 + expected2) // 2
|
|
self.assertEqual(expected, my_avgdiff(blocks1, blocks2))
|
|
|
|
def test_blocks_not_the_same_size(self):
|
|
b = (0,0,0)
|
|
self.assertRaises(DifferentBlockCountError,my_avgdiff,[b,b],[b])
|
|
|
|
def test_first_arg_is_empty_but_not_second(self):
|
|
#Don't return 0 (as when the 2 lists are empty), raise!
|
|
b = (0,0,0)
|
|
self.assertRaises(DifferentBlockCountError,my_avgdiff,[],[b])
|
|
|
|
def test_limit(self):
|
|
ref = (0,0,0)
|
|
b1 = (10,10,10) #avg 30
|
|
b2 = (20,20,20) #avg 45
|
|
b3 = (30,30,30) #avg 60
|
|
blocks1 = [ref,ref,ref]
|
|
blocks2 = [b1,b2,b3]
|
|
self.assertEqual(45,my_avgdiff(blocks1,blocks2,44))
|
|
|
|
def test_min_iterations(self):
|
|
ref = (0,0,0)
|
|
b1 = (10,10,10) #avg 30
|
|
b2 = (20,20,20) #avg 45
|
|
b3 = (10,10,10) #avg 40
|
|
blocks1 = [ref,ref,ref]
|
|
blocks2 = [b1,b2,b3]
|
|
self.assertEqual(40,my_avgdiff(blocks1,blocks2,45 - 1,3))
|
|
|
|
# Bah, I don't know why this test fails, but I don't think it matters very much
|
|
# def test_just_over_the_limit(self):
|
|
# #A score just over the limit might return exactly the limit due to truncating. We should
|
|
# #ceil() the result in this case.
|
|
# ref = (0,0,0)
|
|
# b1 = (10,0,0)
|
|
# b2 = (11,0,0)
|
|
# blocks1 = [ref,ref]
|
|
# blocks2 = [b1,b2]
|
|
# self.assertEqual(11,my_avgdiff(blocks1,blocks2,10))
|
|
#
|
|
def test_return_at_least_1_at_the_slightest_difference(self):
|
|
ref = (0,0,0)
|
|
b1 = (1,0,0)
|
|
blocks1 = [ref for i in xrange(250)]
|
|
blocks2 = [ref for i in xrange(250)]
|
|
blocks2[0] = b1
|
|
self.assertEqual(1,my_avgdiff(blocks1,blocks2))
|
|
|
|
def test_return_0_if_there_is_no_difference(self):
|
|
ref = (0,0,0)
|
|
blocks1 = [ref,ref]
|
|
blocks2 = [ref,ref]
|
|
self.assertEqual(0,my_avgdiff(blocks1,blocks2))
|
|
|
|
|
|
# class TCmaxdiff(unittest.TestCase):
|
|
# def test_empty(self):
|
|
# self.assertRaises(NoBlocksError,maxdiff,[],[])
|
|
#
|
|
# def test_two_blocks(self):
|
|
# b1 = (5,10,15)
|
|
# b2 = (255,250,245)
|
|
# b3 = (0,0,0)
|
|
# b4 = (255,0,255)
|
|
# blocks1 = [b1,b2]
|
|
# blocks2 = [b3,b4]
|
|
# expected1 = 5 + 10 + 15
|
|
# expected2 = 0 + 250 + 10
|
|
# expected = max(expected1,expected2)
|
|
# self.assertEqual(expected,maxdiff(blocks1,blocks2))
|
|
#
|
|
# def test_blocks_not_the_same_size(self):
|
|
# b = (0,0,0)
|
|
# self.assertRaises(DifferentBlockCountError,maxdiff,[b,b],[b])
|
|
#
|
|
# def test_first_arg_is_empty_but_not_second(self):
|
|
# #Don't return 0 (as when the 2 lists are empty), raise!
|
|
# b = (0,0,0)
|
|
# self.assertRaises(DifferentBlockCountError,maxdiff,[],[b])
|
|
#
|
|
# def test_limit(self):
|
|
# b1 = (5,10,15)
|
|
# b2 = (255,250,245)
|
|
# b3 = (0,0,0)
|
|
# b4 = (255,0,255)
|
|
# blocks1 = [b1,b2]
|
|
# blocks2 = [b3,b4]
|
|
# expected1 = 5 + 10 + 15
|
|
# expected2 = 0 + 250 + 10
|
|
# self.assertEqual(expected1,maxdiff(blocks1,blocks2,expected1 - 1))
|
|
# |