def test_output_valiant_background_color(self): """Valiant file with background color.""" img = Image.open('testdata/full-image.png') self.args.bg_color = bg_color_spec.build('16') self.process_image(img) self.args.output = self.args.tmpfile('full-image.o') self.create_output() self.assert_file_eq(self.args.output, self.golden('bg-color', 'o'))
def test_output_valiant_sprite_more(self): """Valiant file for sprites with more colors and background color.""" img = Image.open('testdata/reticule-more.png') self.args.bg_color = bg_color_spec.build('30') self.args.is_sprite = True self.process_image(img) self.args.output = self.args.tmpfile('reticule-more.o') self.create_output() self.golden_file_prefix = 'reticule-more' self.assert_file_eq(self.args.output, self.golden(None, 'o'))
def test_output_background_color(self): """Background color option sets the background color.""" img = Image.open('testdata/full-image.png') self.args.bg_color = bg_color_spec.build('16') self.process_image(img) self.create_output() self.assert_output_result('chr', golden_suffix='-bg-color') self.assert_output_result('nametable', golden_suffix='-bg-color') self.assert_output_result('palette', golden_suffix='-bg-color') self.assert_output_result('attribute')
def test_output_background_color_pair(self): """Background color spec can have look value and fill value.""" img = Image.open('testdata/full-image.png') self.args.bg_color = bg_color_spec.build('16=0f') self.process_image(img) self.create_output() self.assert_output_result('chr', golden_suffix='-bg-color') self.assert_output_result('nametable', golden_suffix='-bg-color') self.assert_output_result('palette', golden_suffix='-black-color') self.assert_output_result('attribute')
def test_output_background_color_mask(self): """Using a mask requires the mask in the bg_color_spec.""" img = Image.open('testdata/full-image-mask.png') self.args.bg_color = bg_color_spec.build('34=30') self.process_image(img) self.create_output() self.golden_file_prefix = 'full-image' self.assert_output_result('chr') self.assert_output_result('nametable') self.assert_output_result('palette') self.assert_output_result('attribute')
def test_output_combines_color_with_background(self): """Palette guesser will take background color into account.""" img = Image.open('testdata/combine-colors.png') self.args.bg_color = bg_color_spec.build('0f') self.process_image(img) self.create_output() self.golden_file_prefix = 'combine-colors' self.assert_output_result('chr') self.assert_output_result('nametable') self.assert_output_result('palette') self.assert_output_result('attribute')
def test_error_background_but_already_filled(self): """If background color cannot fit into any guessed palette, throw error.""" img = Image.open('testdata/full-image.png') self.args.bg_color = bg_color_spec.build('19') self.process_image(img) self.assertTrue(self.err.has()) es = self.err.get() for e in es: msg = '{0} {1}'.format(type(e).__name__, e) self.assertEqual(msg, ('PaletteTooManySubsets - valid: 38-30-16-01\n' + "subsets that can't be merged: [30-19]"))
def test_error_free_sprite_257(self): """Sprite mode using free traversal, throws an error when chr overflows.""" img = Image.open('testdata/free257.png') self.args.bg_color = bg_color_spec.build('39=34') self.args.is_sprite = True self.args.traversal = 'free' self.process_image(img) self.assertTrue(self.err.has()) errs = self.err.get() expect_errors = ['NametableOverflow 1024 at tile (152y,8x)'] actual_errors = ['%s %s' % (type(e).__name__, str(e)) for e in errs] self.assertEqual(actual_errors, expect_errors)
def test_error_background_color_conflict(self): """If background color does not match explicit palette, throw error.""" img = Image.open('testdata/full-image.png') palette_text = 'P/30-38-16-01/30-19-01-01/' self.args.bg_color = bg_color_spec.build('01') self.process_image(img, palette_text=palette_text) self.assertTrue(self.err.has()) es = self.err.get() for e in es: msg = '{0} {1}'.format(type(e).__name__, e) self.assertEqual(msg, ('PaletteBackgroundColorConflictError between ' 'palette /30/ <> bg color /1/'))
def test_output_sprite_color_mask(self): """Bg color spec with mask can be used for sprite images.""" img = Image.open('testdata/full-image-mask.png') self.args.is_sprite = True self.args.bg_color = bg_color_spec.build('34=30') self.process_image(img) self.create_output() self.golden_file_prefix = 'full-image' self.assert_output_result('chr', '-mask-sprite') self.assert_not_exist('nametable') self.assert_output_result('palette', '-mask-sprite') self.assert_not_exist('attribute') self.assert_output_result('spritelist', '-mask-sprite')
def test_output_sprite_as_nametable(self): """Some images can be either nametable or sprites.""" img = Image.open('testdata/reticule.png') self.args.bg_color = bg_color_spec.build('30') self.args.order = 1 self.process_image(img) self.create_output() self.golden_file_prefix = 'reticule' self.assert_output_result('chr', '-as-nametable') self.assert_output_result('nametable') self.assert_output_result('palette') self.assert_output_result('attribute') self.assert_not_exist('spritelist')
def test_output_sprite(self): """Sprite mode.""" img = Image.open('testdata/reticule.png') self.args.bg_color = bg_color_spec.build('30') self.args.is_sprite = True self.process_image(img) self.create_output() self.golden_file_prefix = 'reticule' self.assert_output_result('chr') self.assert_not_exist('nametable') self.assert_output_result('palette', '-sprite') self.assert_not_exist('attribute') self.assert_output_result('spritelist')
def test_output_sprite_more_colors(self): """Sprite mode for image that must use sprites, due to palette.""" img = Image.open('testdata/reticule-more.png') self.args.bg_color = bg_color_spec.build('30') self.args.is_sprite = True self.process_image(img) self.create_output() self.golden_file_prefix = 'reticule' self.assert_output_result('chr', '-more') self.assert_not_exist('nametable') self.assert_output_result('palette', '-more') self.assert_not_exist('attribute') self.assert_output_result('spritelist', '-more')
def test_error_couldnt_convert_rgb(self): """Free traversal gracefully handles color conversion errors.""" img = Image.open('testdata/free-sprites-couldnt-convert-rgb.png') self.args.bg_color = bg_color_spec.build('39=34') self.args.is_sprite = True self.args.traversal = 'free' self.process_image(img) self.assertTrue(self.err.has()) errs = self.err.get() expect_errors = ['CouldntConvertRGB : R ff, G ff, B 00 @ ' + 'tile (26y,4x) / pixel (209y,34x)'] actual_errors = ['%s %s' % (type(e).__name__, str(e)) for e in errs] self.assertEqual(actual_errors, expect_errors)
def test_output_sprite_more_colors_as_nametable(self): """Nametable mode for image that must use sprites, throw error.""" img = Image.open('testdata/reticule-more.png') self.args.bg_color = bg_color_spec.build('30') self.process_image(img) self.assertTrue(self.err.has()) errs = self.err.get() expect_errors = ['PaletteOverflowError @ block (0y,0x)', 'PaletteOverflowError @ block (0y,1x)', 'PaletteOverflowError @ block (1y,0x)', 'PaletteOverflowError @ block (1y,1x)'] actual_errors = ['%s %s' % (type(e).__name__, str(e)) for e in errs] self.assertEqual(actual_errors, expect_errors)
def test_view_for_free_sprite_hard(self): """View for the zones in free sprites with hard areas.""" img = Image.open('testdata/free-sprites-hard.png') self.args.bg_color = bg_color_spec.build('00=30') self.args.is_sprite = True self.args.traversal = 'free' self.args.clear_views() self.args.free_zone_view = self.args.tmppng('free-zone-hard') self.process_image(img) a = app.Application() a.create_views(self.ppu_memory, self.args, img) self.golden_file_prefix = 'free-zone-hard' self.assert_file_eq(self.args.free_zone_view, self.golden('view', 'png'))
def test_output_free_sprite_colors_8x16_traversal(self): """Sprite mode using free traversal, palette is decided based on pair.""" img = Image.open('testdata/free-sprites-colors.png') self.args.bg_color = bg_color_spec.build('00=30') self.args.is_sprite = True self.args.traversal = 'free-8x16' self.process_image(img) self.create_output() self.golden_file_prefix = 'free-sprites-8x16-colors' self.assert_output_result('chr') self.assert_not_exist('nametable') self.assert_output_result('palette') self.assert_not_exist('attribute') self.assert_output_result('spritelist')
def test_output_free_sprite_256(self): """Sprite mode using free traversal, with 256 chr tiles.""" img = Image.open('testdata/free256.png') self.args.bg_color = bg_color_spec.build('39=34') self.args.is_sprite = True self.args.traversal = 'free' self.process_image(img) self.create_output() self.golden_file_prefix = 'free256' self.assert_output_result('chr') self.assert_not_exist('nametable') self.assert_output_result('palette') self.assert_not_exist('attribute') self.assert_output_result('spritelist')
def test_output_free_sprite_multi_traversal(self): """Sprite mode using free traversal and regions are taller than one tile.""" img = Image.open('testdata/free-sprites-multi.png') self.args.bg_color = bg_color_spec.build('00=30') self.args.is_sprite = True self.args.traversal = 'free' self.process_image(img) self.create_output() self.golden_file_prefix = 'free-sprites' self.assert_output_result('chr', '-multi') self.assert_not_exist('nametable') self.assert_output_result('palette') self.assert_not_exist('attribute') self.assert_output_result('spritelist', '-multi')
def test_error_couldnt_convert_rgb(self): """Free traversal gracefully handles color conversion errors.""" img = Image.open('testdata/free-sprites-couldnt-convert-rgb.png') self.args.bg_color = bg_color_spec.build('39=34') self.args.is_sprite = True self.args.traversal = 'free' self.process_image(img) self.assertTrue(self.err.has()) errs = self.err.get() expect_errors = [ 'CouldntConvertRGB : R ff, G ff, B 00 @ ' + 'tile (26y,4x) / pixel (209y,34x)' ] actual_errors = ['%s %s' % (type(e).__name__, str(e)) for e in errs] self.assertEqual(actual_errors, expect_errors)
def test_output_free_sprite_colors_locked_8x16_traversal(self): """Sprite mode using free traversal, locked flag disables flip bits.""" img = Image.open('testdata/free-sprites-colors.png') self.args.bg_color = bg_color_spec.build('00=30') self.args.is_sprite = True self.args.is_locked_tiles = True self.args.traversal = 'free-8x16' self.process_image(img) self.create_output() self.golden_file_prefix = 'free-sprites-8x16-colors' self.assert_output_result('chr', '-locked') self.assert_not_exist('nametable') self.assert_output_result('palette') self.assert_not_exist('attribute') self.assert_output_result('spritelist', '-locked')
def test_views_sprite(self): """Create views for a sprite image.""" img = Image.open('testdata/reticule.png') self.args.bg_color = bg_color_spec.build('30') self.args.is_sprite = True self.args.nametable_view = None self.args.colorization_view = None self.process_image(img) a = app.Application() a.create_views(self.ppu_memory, self.args, img) self.golden_file_prefix = 'reticule' self.assert_file_eq(self.args.palette_view, self.golden('pal-view', 'png')) self.assert_file_eq(self.args.reuse_view, self.golden('reuse-view', 'png')) self.assert_file_eq(self.args.chr_view, self.golden('chr-view', 'png')) self.assert_file_eq(self.args.grid_view, self.golden('grid-view', 'png'))
def test_bg_color_spec_simple(self): spec = bg_color_spec.build('01') self.assertEqual(spec.mask, None) self.assertEqual(spec.fill, 1)
def test_bg_color_spec_pair(self): spec = bg_color_spec.build('01=02') self.assertEqual(spec.mask, 1) self.assertEqual(spec.fill, 2)