import copy import unittest from pathlib import Path from PIL import Image from automation.engine import Matcher, Region, WorkflowError, load_flow from automation.sweep import SweepRunner ROOT = Path(__file__).resolve().parent.parent class SweepDesktop: def __init__(self, images): self.images = images self.index = 0 self.clicks = [] def screenshot(self): return self.images[min(self.index, len(self.images) - 1)] def click(self, point, region, size, hold=0.2): self.clicks.append((point, hold)) self.index += 1 class SweepTests(unittest.TestCase): def setUp(self): self.flow = load_flow(ROOT / 'workflows/sweep_claim.json') self.flow['interval_seconds'] = 0 self.matcher = Matcher(ROOT / 'assets') self.region = Region(0, 0, 562, 1002) def image(self, state): image = Image.new('RGB', (562, 1002), (42, 58, 73)) for spec in self.flow['states'][state]: template = Image.open(ROOT / 'assets' / spec['template']).convert('RGB') x, y, _, _ = spec['search'] image.paste(template, (x + 5, y + 5)) return image def runner(self, states): desktop = SweepDesktop([self.image(state) for state in states]) flow = copy.deepcopy(self.flow) return desktop, SweepRunner(desktop, self.matcher, flow, lambda _: self.region, log=lambda _: None, timeout=0.8) def test_five_sweeps_dismisses_each_result_and_returns_home(self): states = ['home', 'sweep_available'] for _ in range(5): states.extend(('reward', 'sweep_available')) states.append('home') desktop, runner = self.runner(states) self.assertEqual(runner.run(5), 'completed') expected = [(self.flow['clicks']['open_pig'], 0.2)] for _ in range(5): expected.extend(((self.flow['clicks']['sweep'], 0.8), (self.flow['clicks']['dismiss_reward'], 0.2))) expected.append((self.flow['clicks']['close'], 0.2)) self.assertEqual(desktop.clicks, expected) def test_invalid_count_stops_before_clicking(self): desktop, runner = self.runner(['home']) with self.assertRaises(WorkflowError): runner.run(0) self.assertEqual(desktop.clicks, []) if __name__ == '__main__': unittest.main()