def test_check_insert(self): fields = [Field('id', 'int', primary_key=True), Field('name', 'str')] table = Table('users', fields) table.insert(id=1, name='Pierre') self.assertTrue(len(table.values) == 1)
def set_ui(self): """ Sets the elements in the UI. """ self.canvas = tk.Canvas(self) self.canvas.pack() self.field = Field(self.canvas)
def test_check_no_exception_if_nullable_field_missing(self): fields = [ Field('id', 'int', primary_key=True), Field('name', 'str'), Field('age', 'int', nullable=True) ] table = Table('users', fields) table.insert(id=5, name='Pierre')
def create_elements_search_space(self): field = Field(0, 0, self.num) field.inspect_sudoku(self.repr) search_space = [] for i in range(self.num): a = [] for j in range(self.num): a.append(len(Field(i, j, self.num).get_search_space())) search_space.append(a) return search_space
def test_instanciation_with_bad_primary_key_config(self): fields = [Field('name', 'str')] # No primary key with self.assertRaises(Exception): table = Table('table_name', [Field('name', 'str')]) # Several primary keys with self.assertRaises(Exception): table = Table('table_name', [ Field('id_1', 'int', primary_key=True), Field('id_2', 'int', primary_key=True) ])
def start_new_game(self): self._initial_field = Field(self._cols, self._rows, self._colors_num) self._field = deepcopy(self._initial_field) self._score = 0 self._highlighted = 0 self._highlighted_chain = None self._gameover = False
def test_check_value_integrity(self): field = Field('some_name', 'str') with self.assertRaises(Exception): field.check_value_integrity(123) with self.assertRaises(Exception): field.check_value_integrity(True) field.check_value_integrity('test with a valid type')
class TestField(unittest.TestCase): def setUp(self): self.field = Field(10,10) def test_initialize(self): self.assertEquals(10, self.field.x_bound) self.assertEquals(10, self.field.y_bound) def test_position_higher_than_bounds(self): self.assertFalse(self.field.is_inside_of_bounds(10,11000)) def test_position_lower_than_bounds(self): self.assertFalse(self.field.is_inside_of_bounds(0,-1000)) def test_position_is_inside_of_bounds(self): self.assertTrue(self.field.is_inside_of_bounds(1,10))
def test_export(self): fields = [ Field('id', 'int', primary_key=True), Field('name', 'str'), Field('age', 'int', nullable=True) ] table = Table('users', fields) table.insert(id=5, name='Pierre') table.insert(id=6, name='Roger') self.assertEqual(table.export(), [{ 'id': 5, 'name': 'Pierre' }, { 'id': 6, 'name': 'Roger' }])
def set_field(self, cols: int, rows: int, col_field: list): self._cols = cols self._rows = rows self._colors_num = 2 self._initial_field = Field(self._cols, self._rows, field=col_field) self._field = deepcopy(self._initial_field) self._score = 0 self._highlighted = 0 self._highlighted_chain = None self._gameover = False
def __init__(self, width, height): self.width = width self.height = height self.fields = [] self.agents = [] for x in range(width): line = [] for y in range(height): line.append(Field(x, y)) self.fields.append(line) WorldSearcher.world = self
def __init__(self, screen, x_shift, key_left, key_right, key_rotate, key_faster, key_pause): self.screen = screen self.x_shift = x_shift self.field = Field(self, self.screen, self.x_shift + Settings.field_margin, Settings.field_margin) self.score = 0 self.high_score = Game.get_high_score() self.pause_label = Settings.font_header.render('PAUSE', 1, Settings.font_color) self.score_label = Settings.font.render('SCORE', 1, Settings.font_color) self.high_score_label = Settings.font.render('HIGHSCORE', 1, Settings.font_color) self.new_high_score_label = Settings.font.render( 'NEW HIGHSCORE!', 1, Settings.font_color) self.high_score_num = Settings.font_medium.render( str(self.high_score), 1, Settings.font_color) self.score_num = Settings.font_medium.render(str(self.score), 1, Settings.font_color) self.game_over_alert = Alert( self.screen, 'GAME OVER!', Settings.font_medium, self.x_shift + Settings.single_screen_width // 2, Settings.screen_height * 0.2) self.key_left = key_left self.key_right = key_right self.key_rotate = key_rotate self.key_faster = key_faster self.key_pause = key_pause self.over = False self.pause = False
def add_values(self, row, col): if col == self.num: if row == self.num - 1: return True else: col = 0 row += 1 if self.repr[row][col] == 0: f = Field(row, col, self.num) for val in f.search_space: if self.check(val, row, col): self.repr[row][col] = val if self.add_values(row, col + 1): return True else: self.repr[row][col] = 0 else: if self.add_values(row, col + 1): return True
def add_values(self): if self.count_zeros() == 0: return True else: row, col = self.get_min() field = Field(row, col, self.num) if self.repr[row][col] == 0: for val in field.search_space: if self.check(val, row, col): self.repr[row][col] = val field.reduce_search_space(val) if self.add_values(): return True else: field.return_arc_consistency(val) self.repr[row][col] = 0 if (row, col) in ForwardCheckingDO.closed_list: self.elements_search_space[row][col] -= 10 ForwardCheckingDO.closed_list.remove((row, col)) else: if self.add_values(): return True
class Game: def __init__(self, screen, x_shift, key_left, key_right, key_rotate, key_faster, key_pause): self.screen = screen self.x_shift = x_shift self.field = Field(self, self.screen, self.x_shift + Settings.field_margin, Settings.field_margin) self.score = 0 self.high_score = Game.get_high_score() self.pause_label = Settings.font_header.render('PAUSE', 1, Settings.font_color) self.score_label = Settings.font.render('SCORE', 1, Settings.font_color) self.high_score_label = Settings.font.render('HIGHSCORE', 1, Settings.font_color) self.new_high_score_label = Settings.font.render( 'NEW HIGHSCORE!', 1, Settings.font_color) self.high_score_num = Settings.font_medium.render( str(self.high_score), 1, Settings.font_color) self.score_num = Settings.font_medium.render(str(self.score), 1, Settings.font_color) self.game_over_alert = Alert( self.screen, 'GAME OVER!', Settings.font_medium, self.x_shift + Settings.single_screen_width // 2, Settings.screen_height * 0.2) self.key_left = key_left self.key_right = key_right self.key_rotate = key_rotate self.key_faster = key_faster self.key_pause = key_pause self.over = False self.pause = False def update_high_score(self): if self.score < self.high_score: return file = open(Settings.high_score_file_name, 'w') file.write(str(self.score) + '\n') file.close() @staticmethod def get_high_score(): file = open(Settings.high_score_file_name) score_str = file.read() file.close() try: return int(score_str) except ValueError: return 0 def refresh(self): if self.pause: self.screen.blit(self.pause_label, ( self.x_shift + (Settings.single_screen_width - self.pause_label.get_width()) / 2, Settings.screen_height * 0.3)) else: self.field.refresh() self.refresh_labels() def refresh_labels(self): self.score_num = Settings.font_medium.render(str(self.score), 1, Settings.font_color) self.screen.blit( self.score_label, (self.x_shift + Settings.field_width_with_margin + (Settings.game_side_width - self.score_label.get_width()) / 2, Settings.screen_height * 0.3)) self.screen.blit(self.high_score_label, ( self.x_shift + Settings.field_width_with_margin + (Settings.game_side_width - self.high_score_label.get_width()) / 2, Settings.screen_height * 0.5)) self.screen.blit( self.score_num, (self.x_shift + Settings.field_width_with_margin + (Settings.game_side_width - self.score_num.get_width()) / 2, Settings.screen_height * 0.35)) self.screen.blit( self.high_score_num, (self.x_shift + Settings.field_width_with_margin + (Settings.game_side_width - self.high_score_num.get_width()) / 2, Settings.screen_height * 0.55)) if self.high_score < self.score: self.screen.blit(self.new_high_score_label, (self.x_shift + Settings.field_width_with_margin + (Settings.game_side_width - self.new_high_score_label.get_width()) / 2, Settings.screen_height * 0.25)) if self.over: self.game_over_alert.draw() def check_event(self, event): if self.over: return if event.type == pygame.KEYDOWN: if event.key == self.key_pause: self.pause = not self.pause elif self.field.falling_figure is None or self.pause: return elif event.key == self.key_rotate: self.field.falling_figure.rotate_clock_wise() elif event.key == self.key_left: self.field.falling_figure.move_left() elif event.key == self.key_right: self.field.falling_figure.move_right() elif event.key == self.key_faster: self.field.falling_figure.move_delay = Settings.game_delay_short if event.type == pygame.KEYUP: if self.field.falling_figure is None: return if event.key == self.key_faster: self.field.falling_figure.move_delay = Settings.game_delay
def main(): field = Field() field.start()
def test_normal_instanciation(self): fields = [Field('id', 'int', primary_key=True), Field('name', 'str')] table = Table('table_name', fields)
from src.field import Field from src.table import Table from src.db import Db fields = [ Field('id', 'int', primary_key=True), Field('name', 'str'), Field('city', 'str', nullable=True), Field('activated', 'bool') ] table = Table('users', fields) db = Db([table]) print(Db)
def test_check_exception_if_wrong_type(self): fields = [Field('id', 'int', primary_key=True), Field('name', 'str')] table = Table('users', fields) with self.assertRaises(Exception): table.insert(id='test', name='Pierre')
def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(767, 585) MainWindow.setMinimumSize(QtCore.QSize(295, 218)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) self.horizontalLayout.setContentsMargins(1, 1, 1, 1) self.horizontalLayout.setSpacing(2) self.horizontalLayout.setObjectName("horizontalLayout") self.splitter = QtWidgets.QSplitter(self.centralwidget) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setObjectName("splitter") self.optionsHolder = QtWidgets.QScrollArea(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.optionsHolder.sizePolicy().hasHeightForWidth()) self.optionsHolder.setSizePolicy(sizePolicy) self.optionsHolder.setMinimumSize(QtCore.QSize(150, 0)) self.optionsHolder.setMaximumSize(QtCore.QSize(200, 16777215)) self.optionsHolder.setWidgetResizable(True) self.optionsHolder.setObjectName("optionsHolder") self.optionsHolderContents = QtWidgets.QWidget() self.optionsHolderContents.setGeometry(QtCore.QRect(0, 0, 198, 520)) self.optionsHolderContents.setObjectName("optionsHolderContents") self.optionsVerticalLayout = QtWidgets.QVBoxLayout( self.optionsHolderContents) self.optionsVerticalLayout.setContentsMargins(2, 2, 2, 2) self.optionsVerticalLayout.setSpacing(5) self.optionsVerticalLayout.setObjectName("optionsVerticalLayout") self.instrumentName = QtWidgets.QLabel(self.optionsHolderContents) self.instrumentName.setAlignment(QtCore.Qt.AlignCenter) self.instrumentName.setObjectName("instrumentName") self.optionsVerticalLayout.addWidget(self.instrumentName) self.colorChanger = QtWidgets.QWidget(self.optionsHolderContents) self.colorChanger.setMinimumSize(QtCore.QSize(80, 70)) self.colorChanger.setMaximumSize(QtCore.QSize(80, 70)) self.colorChanger.setObjectName("colorChanger") self.backgroundColorChange = ClickableGraphicsView(self.colorChanger) self.backgroundColorChange.setGeometry(QtCore.QRect(20, 20, 40, 40)) self.backgroundColorChange.setObjectName("backgroundColorChange") self.foregroundColorChange = ClickableGraphicsView(self.colorChanger) self.foregroundColorChange.setGeometry(QtCore.QRect(0, 0, 40, 40)) self.foregroundColorChange.setObjectName("foregroundColorChange") self.swapColors = QtWidgets.QPushButton(self.colorChanger) self.swapColors.setGeometry(QtCore.QRect(40, 0, 21, 21)) self.swapColors.setFlat(True) self.swapColors.setObjectName("swapColors") self.optionsVerticalLayout.addWidget(self.colorChanger) self.brushSizeChanger = QtWidgets.QWidget(self.optionsHolderContents) self.brushSizeChanger.setObjectName("brushSizeChanger") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.brushSizeChanger) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setSpacing(8) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label = QtWidgets.QLabel(self.brushSizeChanger) self.label.setObjectName("label") self.horizontalLayout_2.addWidget(self.label) self.brushSize = QtWidgets.QSpinBox(self.brushSizeChanger) self.brushSize.setMaximum(10000) self.brushSize.setProperty("value", 5) self.brushSize.setObjectName("brushSize") self.horizontalLayout_2.addWidget(self.brushSize) spacerItem = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem) self.optionsVerticalLayout.addWidget(self.brushSizeChanger) self.figureChanger = QtWidgets.QWidget(self.optionsHolderContents) self.figureChanger.setObjectName("figureChanger") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.figureChanger) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setSpacing(8) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label_2 = QtWidgets.QLabel(self.figureChanger) self.label_2.setObjectName("label_2") self.horizontalLayout_3.addWidget(self.label_2) self.figure = QtWidgets.QComboBox(self.figureChanger) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.figure.sizePolicy().hasHeightForWidth()) self.figure.setSizePolicy(sizePolicy) self.figure.setObjectName("figure") self.horizontalLayout_3.addWidget(self.figure) spacerItem1 = QtWidgets.QSpacerItem(5, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem1) self.optionsVerticalLayout.addWidget(self.figureChanger) self.figureFillChanger = QtWidgets.QWidget(self.optionsHolderContents) self.figureFillChanger.setObjectName("figureFillChanger") self.figureFillChangerLayout = QtWidgets.QVBoxLayout( self.figureFillChanger) self.figureFillChangerLayout.setSpacing(3) self.figureFillChangerLayout.setObjectName("figureFillChangerLayout") self.label_3 = QtWidgets.QLabel(self.figureFillChanger) self.label_3.setObjectName("label_3") self.figureFillChangerLayout.addWidget(self.label_3) self.noFill = QtWidgets.QRadioButton(self.figureFillChanger) self.noFill.setObjectName("noFill") self.figureFillChangerGroup = QtWidgets.QButtonGroup(MainWindow) self.figureFillChangerGroup.setObjectName("figureFillChangerGroup") self.figureFillChangerGroup.addButton(self.noFill) self.figureFillChangerLayout.addWidget(self.noFill) self.frontFill = QtWidgets.QRadioButton(self.figureFillChanger) self.frontFill.setObjectName("frontFill") self.figureFillChangerGroup.addButton(self.frontFill) self.figureFillChangerLayout.addWidget(self.frontFill) self.backFill = QtWidgets.QRadioButton(self.figureFillChanger) self.backFill.setObjectName("backFill") self.figureFillChangerGroup.addButton(self.backFill) self.figureFillChangerLayout.addWidget(self.backFill) self.optionsVerticalLayout.addWidget(self.figureFillChanger) spacerItem2 = QtWidgets.QSpacerItem(20, 339, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.optionsVerticalLayout.addItem(spacerItem2) self.optionsHolder.setWidget(self.optionsHolderContents) self.imHolder = QtWidgets.QScrollArea(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.imHolder.sizePolicy().hasHeightForWidth()) self.imHolder.setSizePolicy(sizePolicy) self.imHolder.setWidgetResizable(True) self.imHolder.setObjectName("imHolder") self.imHolderContents = QtWidgets.QWidget() self.imHolderContents.setGeometry(QtCore.QRect(0, 0, 559, 520)) self.imHolderContents.setObjectName("imHolderContents") self.pictureHolder = QtWidgets.QGridLayout(self.imHolderContents) self.pictureHolder.setContentsMargins(0, 0, 0, 0) self.pictureHolder.setObjectName("pictureHolder") self.field = Field(self.imHolderContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.field.sizePolicy().hasHeightForWidth()) self.field.setSizePolicy(sizePolicy) self.field.setText("") self.field.setAlignment(QtCore.Qt.AlignCenter) self.field.setObjectName("field") self.pictureHolder.addWidget(self.field, 0, 1, 1, 1) self.imHolder.setWidget(self.imHolderContents) self.horizontalLayout.addWidget(self.splitter) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 767, 22)) self.menubar.setObjectName("menubar") self.menu = QtWidgets.QMenu(self.menubar) self.menu.setObjectName("menu") self.menu_2 = QtWidgets.QMenu(self.menubar) self.menu_2.setObjectName("menu_2") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.instrumentsBar = QtWidgets.QToolBar(MainWindow) self.instrumentsBar.setMovable(False) self.instrumentsBar.setObjectName("instrumentsBar") MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.instrumentsBar) self.action_new = QtWidgets.QAction(MainWindow) self.action_new.setObjectName("action_new") self.action_open = QtWidgets.QAction(MainWindow) self.action_open.setObjectName("action_open") self.action_save = QtWidgets.QAction(MainWindow) self.action_save.setObjectName("action_save") self.action_undo = QtWidgets.QAction(MainWindow) self.action_undo.setObjectName("action_undo") self.action_redo = QtWidgets.QAction(MainWindow) self.action_redo.setObjectName("action_redo") self.menu.addAction(self.action_new) self.menu.addAction(self.action_open) self.menu.addAction(self.action_save) self.menu_2.addAction(self.action_undo) self.menu_2.addAction(self.action_redo) self.menubar.addAction(self.menu.menuAction()) self.menubar.addAction(self.menu_2.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow)
def test_check_exception_if_not_nullable_field_missing(self): fields = [Field('id', 'int', primary_key=True), Field('name', 'str')] table = Table('users', fields) with self.assertRaises(Exception): table.insert(name='Pierre')
def setUp(self): self.field = Field(10,10)
def test_normal_instanciation(self): field = Field('some_name', 'str')
def test_exception_if_bad_type(self): with self.assertRaises(Exception): field = Field('some_name', 'some_invalid_type')
class Application(tk.Tk): def __init__(self): super().__init__() self.state = tags.FIRST_TURN self.current_pawn = None self.withdraw() self.title("Solitaire") self.set_menu() self.set_ui() self.set_events() self.resizable(False, False) self.init_new_game() self.deiconify() # UI methods def set_ui(self): """ Sets the elements in the UI. """ self.canvas = tk.Canvas(self) self.canvas.pack() self.field = Field(self.canvas) def set_menu(self): """ Sets the menu in the UI. """ menu = tk.Menu(self) menu_game = tk.Menu(menu, tearoff=0) menu_game.add_command(label="Nouveau", command=self.init_new_game) menu.add_cascade(label="Jeu", menu=menu_game) self.configure(menu=menu) def set_events(self): """ Sets the events in the UI. """ self.canvas.bind("<Button-1>", self.event_left_click) self.canvas.bind("<Button-3>", self.event_right_click) # Game methods def init_new_game(self): """ Initializes a new game/ """ self.field.init() self.state = tags.FIRST_TURN # Events def event_left_click(self, event): """ Manages the left click button event. """ # Verify if a box has been clicked box = self.field.get(event.x, event.y) if not box: return # First turn : remove a pawn if self.state == tags.FIRST_TURN: self.field.toggle(box) self.field.show_movable_pawns() self.state = tags.SELECT_PAWN # Select a pawn elif self.state == tags.SELECT_PAWN: if self.field.box_is(box, tags.PAWN_MOVABLE): self.current_pawn = box self.field.show_target_box(box) self.state = tags.MOVE_PAWN # Move the pawn to an empty space # and remove the pawn between elif self.state == tags.MOVE_PAWN: if self.field.box_is(box, tags.EMPTY_TARGET): # Move the pawn self.field.toggle(box) self.field.toggle(self.current_pawn) # Remove the middle pawn i_box, j_box, _ = self.field.get_info(box) i_cur, j_cur, _ = self.field.get_info(self.current_pawn) i = (i_box + i_cur) // 2 j = (j_box + j_cur) // 2 self.field.toggle(self.field.grid[i][j]) self.current_pawn = None # Show next move self.field.show_movable_pawns() self.state = tags.SELECT_PAWN # Undo pawn selection elif box == self.current_pawn: self.field.show_movable_pawns() self.state = tags.SELECT_PAWN def event_right_click(self, event): # Verify if a box has been clicked box = self.field.get(event.x, event.y) if not box: return self.field.toggle(box)
def solve_sudoku(self): if self.add_values(0, 0): Field.reset() print(self)