def testCreation(self):
        """
        Test creating a LinzMeshblockScenarioBridge
        """
        meshblock_layer = make_meshblock_layer()
        mb_electorate_layer = make_meshblock_electorate_layer()

        bridge = LinzMeshblockScenarioBridge(
            meshblock_layer=meshblock_layer,
            meshblock_scenario_layer=mb_electorate_layer,
            meshblock_number_field_name='MeshblockNumber')
        self.assertEqual(bridge.meshblock_layer, meshblock_layer)
        self.assertEqual(bridge.meshblock_scenario_layer, mb_electorate_layer)
    def testMeshblockIds(self):
        """
        Test retrieving target meshblock feature ids for different scenarios
        """
        meshblock_layer = make_meshblock_layer()
        mb_electorate_layer = make_meshblock_electorate_layer()

        bridge = LinzMeshblockScenarioBridge(
            meshblock_layer=meshblock_layer,
            meshblock_scenario_layer=mb_electorate_layer,
            meshblock_number_field_name='MeshblockNumber')

        bridge.scenario = 1
        mb_ids = bridge.get_target_meshblock_ids_from_numbers([0, 1])
        self.assertEqual(mb_ids, {0: 3, 1: 4})
        bridge.scenario = 2
        mb_ids = bridge.get_target_meshblock_ids_from_numbers([0, 1])
        self.assertEqual(mb_ids, {0: 1, 1: 2})
    def testGetNewElectorates(self):
        """
        Test retrieving pending electorate changes
        """
        meshblock_layer = make_meshblock_layer()
        mb_electorate_layer = make_meshblock_electorate_layer()

        bridge = LinzMeshblockScenarioBridge(
            meshblock_layer=meshblock_layer,
            meshblock_scenario_layer=mb_electorate_layer,
            meshblock_number_field_name='MeshblockNumber')

        bridge.task = 'GN'
        bridge.scenario = 1
        # not editable
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {})
        # no changes in buffer
        self.assertTrue(meshblock_layer.startEditing())
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {})

        # add change
        features = [f for f in meshblock_layer.getFeatures()]  # pylint: disable=unnecessary-comprehension
        meshblock_layer.changeAttributeValues(features[0].id(), {1: 'c'})
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {0: 'c'})
        meshblock_layer.changeAttributeValues(features[0].id(), {1: 'd'})
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {0: 'd'})
        meshblock_layer.changeAttributeValues(features[1].id(), {1: 'c'})
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {0: 'd', 1: 'c'})

        # no saved changes in scenario yet!
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'a', 'x'], [2, 2, 1, 'b', 'y'],
                                   [3, 1, 0, 'c', 'z'], [4, 1, 1, 'd', 'zz']])

        bridge.meshblock_layer_saved()
        self.assertTrue(meshblock_layer.commitChanges())
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'a', 'x'], [2, 2, 1, 'b', 'y'],
                                   [3, 1, 0, 'd', 'z'], [4, 1, 1, 'c', 'zz']])
        new_electorates = bridge.get_new_electorates()
        self.assertEqual(new_electorates, {})

        # different scenario
        bridge.scenario = 2
        self.assertTrue(meshblock_layer.startEditing())
        meshblock_layer.changeAttributeValues(features[0].id(), {1: 'd'})
        meshblock_layer.changeAttributeValues(features[1].id(), {1: 'c'})
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'a', 'x'], [2, 2, 1, 'b', 'y'],
                                   [3, 1, 0, 'd', 'z'], [4, 1, 1, 'c', 'zz']])
        bridge.meshblock_layer_saved()
        self.assertTrue(meshblock_layer.commitChanges())
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'd', 'x'], [2, 2, 1, 'c', 'y'],
                                   [3, 1, 0, 'd', 'z'], [4, 1, 1, 'c', 'zz']])

        # different task
        bridge.task = 'GS'
        self.assertTrue(meshblock_layer.startEditing())
        meshblock_layer.changeAttributeValues(features[0].id(), {1: 'a'})
        meshblock_layer.changeAttributeValues(features[1].id(), {1: 'b'})
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'd', 'x'], [2, 2, 1, 'c', 'y'],
                                   [3, 1, 0, 'd', 'z'], [4, 1, 1, 'c', 'zz']])
        bridge.meshblock_layer_saved()
        self.assertTrue(meshblock_layer.commitChanges())
        results = [f.attributes() for f in mb_electorate_layer.getFeatures()]
        self.assertEqual(results, [[1, 2, 0, 'd', 'a'], [2, 2, 1, 'c', 'b'],
                                   [3, 1, 0, 'd', 'z'], [4, 1, 1, 'c', 'zz']])