def test_set_state(self):
        new_state = {StateKey.POSITION: 262}

        self.stream_handle = StringIO(WfpParserUnitTestCase.TEST_DATA)
        self.parser = WfpParser(self.config, self.position, self.stream_handle,
                                self.pos_callback, self.pub_callback)

        result = self.parser.get_records(1)
        self.assert_result(result, 213, self.particle_a)
        result = self.parser.get_records(1)
        self.assert_result(result, 262, self.particle_b)
        result = self.parser.get_records(1)
        self.assert_result(result, 311, self.particle_c)
        result = self.parser.get_records(1)
        self.assert_result(result, 360, self.particle_d)

        self.parser.set_state(new_state)
        #
        # Oddly the position is off by 1 after repositioning.
        # puzzling, but seems harmless.
        #

        result = self.parser.get_records(1)
        self.assert_result(result, 312, self.particle_c)
        result = self.parser.get_records(1)
        self.assert_result(result, 362, self.particle_d)
    def test_happy_path(self):
        """
        Test the happy path of operations where the parser takes the input
        and spits out a valid data particle given the stream.
        """
        self.stream_handle = StringIO(WfpParserUnitTestCase.TEST_DATA)
        self.parser = WfpParser(
            self.config, self.position, self.stream_handle, self.pos_callback,
            self.pub_callback)  # last one is the link to the data source

        result = self.parser.get_records(1)
        self.assert_result(result, 213, self.particle_a)
        result = self.parser.get_records(1)
        self.assert_result(result, 262, self.particle_b)
        result = self.parser.get_records(1)
        self.assert_result(result, 311, self.particle_c)
        result = self.parser.get_records(1)
        self.assert_result(result, 360, self.particle_d)

        # no data left, dont move the position
        result = self.parser.get_records(1)
        self.assertEqual(result, [])
        self.assertEqual(self.parser._state[StateKey.POSITION], 360)
        self.assertEqual(self.position_callback_value[StateKey.POSITION], 360)

        self.assert_(isinstance(self.publish_callback_value, list))
        self.assertEqual(self.publish_callback_value[0], self.particle_d)
    def test_bad_data(self):
        """ There's a bad sample in the data! Ack! Skip it! """
        self.stream_handle = StringIO(WfpParserUnitTestCase.BAD_TEST_DATA)
        self.parser = WfpParser(self.config, self.position, self.stream_handle,
                                self.pos_callback, self.pub_callback)

        result = self.parser.get_records(1)
        log.error("RESULT = " + str(result))
        self.assert_result(result, 243, self.particle_b)
    def test_long_stream(self):
        self.stream_handle = StringIO(WfpParserUnitTestCase.LONG_DATA)
        self.parser = WfpParser(self.config, self.position, self.stream_handle,
                                self.pos_callback, self.pub_callback)

        result = self.parser.get_records(44)
        self.assertEqual(result[-1], self.particle_z)
        self.assertEqual(self.parser._state[StateKey.POSITION], 703)
        self.assertEqual(self.position_callback_value[StateKey.POSITION], 703)
        self.assertEqual(self.publish_callback_value[-1], self.particle_z)
    def test_mid_state_start(self):
        new_state = {StateKey.POSITION: 313}
        self.stream_handle = StringIO(WfpParserUnitTestCase.TEST_DATA)
        self.parser = WfpParser(self.config, new_state, self.stream_handle,
                                self.pos_callback, self.pub_callback)
        #
        # Oddly the position is off by 1 after repositioning.
        # puzzling, but seems harmless.
        #

        result = self.parser.get_records(1)
        self.assert_result(result, 362, self.particle_d)
    def test_get_many(self):
        self.stream_handle = StringIO(WfpParserUnitTestCase.TEST_DATA)
        self.parser = WfpParser(self.config, self.position, self.stream_handle,
                                self.pos_callback, self.pub_callback)

        result = self.parser.get_records(2)
        self.assertEqual(result, [self.particle_a, self.particle_b])
        self.assertEqual(self.parser._state[StateKey.POSITION], 262)
        self.assertEqual(self.position_callback_value[StateKey.POSITION], 262)

        self.assertEqual(self.publish_callback_value[0], self.particle_a)
        self.assertEqual(self.publish_callback_value[1], self.particle_b)