def test_coefficient_updates(self):
        sim = SimulatedUSB()

        coeff_dict = {'C0': '7.25405E+02',
                      'C1': '1.43880E-01',
                      'C2': '7.16617E-06',
                      'C3': '-8.68137E-09'
                     }

        # Raises error when trying to update without assignment
        self.assertRaises(ValueError, sim.new_coefficients, coeff_dict)

        self.assertTrue(sim.assign("Stroker785M"))

        # Assign new coefficients
        self.assertTrue(sim.new_coefficients(coeff_dict))

        wavenum_axis, intensity_data = sim.get_line_wavenumber()

        first_conv = "-1046.55"
        last_conv = "2487.62"
        self.assertEqual("%05.2f" % wavenum_axis[0], first_conv)
        self.assertEqual("%05.2f" % wavenum_axis[-1], last_conv)
        self.assertEqual(intensity_data[0], 0)
        self.assertEqual(intensity_data[2047], 2047)
    def test_xml_output(self):
        # Click the acquire button, read from the last generated xml
        # output variable 
        xml_output = self.form.last_xml_output()
        self.assertEqual(xml_output, "invalid")

        # Simulated device is rquired
        sim_device = SimulatedUSB()
        sim_device.assign("Stroker785L")
        self.assertTrue(self.form.set_device(sim_device))

        QtTest.QTest.mouseClick(self.form.ui.toolButtonAcquire,
            QtCore.Qt.LeftButton)
        xml_output = self.form.last_xml_output()

        head_str = "<title>Data from Wasatch Photonics device</title>"
        self.assertTrue(head_str in xml_output)

        self.assertTrue("$datestamp" not in xml_output)
        self.assertTrue("$timestamp" not in xml_output)

        # Make sure none of the python string template tags persist in
        # the xml output - check for $ which as of this writing only
        # appears in the python template tag areas
        self.assertFalse("$" in xml_output)
    def test_wavenumber_translation(self):
        # Create a simulation device, assign it to the device in the
        # application
        sim_device = SimulatedUSB()
        self.assertTrue(sim_device.assign("Stroker785L"))

        # Assign the calibration coefficients
        self.form.ui.lineEditCoeff0.setText("7.25405E+02")
        self.form.ui.lineEditCoeff1.setText("1.43880E-01")
        self.form.ui.lineEditCoeff2.setText("7.16617E-06")
        self.form.ui.lineEditCoeff3.setText("-8.68137E-09")

        self.assertTrue(self.form.set_device(sim_device))
        # Click the acquire button, expect the Y axis to match the
        # wavenumbers specified by the calibration coefficients
        QtTest.QTest.mouseClick(self.form.ui.toolButtonAcquire,
            QtCore.Qt.LeftButton)
        xml_output = self.form.last_xml_output()

        xval = xml_output.split("dim = \"x\">")[1]
        xval = xval.split(" \n\t\t</values>")[0]
        xval = xval.replace('\n\t\t\t', '') # remove prefix
        xaxis_data = xval.split(' ')

        first_conv = "-1046.55"
        last_conv = "1255.15"
        self.assertEqual("%05.2f" % float(xaxis_data[0]), first_conv)
        self.assertEqual("%05.2f" % float(xaxis_data[-1]), last_conv)
    def find_first_device_or_simulate(self):
        simulated_device = SimulatedUSB()
        try:
            fd = FindDevices()
            result, usb_info = fd.list_usb()
            log.debug(" USB ID strings: %s" % usb_info[0])
            (vid, pid) = usb_info[0].split(':')[0:2]
        except:
            log.debug("Error find devices: %s" % str(sys.exc_info()))
            

        try:
            real_device = CameraUSB()
            log.debug("Attempt real device connection")
            if real_device.connect(9386, pid):
                log.debug("Succesfull connection to: %s" % pid)
                return real_device
        except:
            log.debug("Exception %s" % str(sys.exc_info()))
            pass

        log.debug("Return simulated device")
        simulated_device.assign("Stroker785L")
        simulated_device.serial_number = "Simulated Stroker785L"
        return simulated_device            
    def test_simulated_integration_times(self):
        # Create a regular simulated device, trigger a long integration,
        # expect it to return instantly
        sim = SimulatedUSB()
        self.assertTrue(sim.assign("Stroker785L"))
        self.assertTrue(sim.set_integration_time(3000))

        start_time = time.time()
        pixel_data = sim.get_line_pixel()
        end_time = time.time()

        self.assertLess(end_time - start_time, 1)
    def test_device_status_displayed(self):
        # Form will create a Stroker785L simulated device on first call
        # to set_device
        self.assertEqual(self.form.ui.labelDeviceText.text(), 
            "Connected to Simulated Stroker785L")

        # Create a simulation device, set in form, make sure the device
        # label updates
        sim_device = SimulatedUSB()
        sim_device.assign("Stroker785L")

        self.assertTrue(self.form.set_device(sim_device))
        self.assertEqual(self.form.ui.labelDeviceText.text(), 
            "Connected to Stroker785L")
    def test_connect_reconnect_disconnect(self):
        sim = SimulatedUSB()
        # Connect ok
        self.assertTrue(sim.assign("Stroker785L"))
        self.assertTrue(sim.connect())

        # Re-connect raises typeerror
        self.assertRaises(TypeError, sim.connect)

        # disconnect ok
        self.assertTrue(sim.disconnect())

        # re-disconnect raises typeerror
        self.assertRaises(TypeError, sim.disconnect)
    def test_simulated_assign(self):
        sim = SimulatedUSB()

        # This is the break in functionality in the api. If you attempt
        # to connect to a simulation device before assigning a type, it
        # throws a valueerror exception.
        self.assertRaises(ValueError, sim.connect)
        self.assertRaises(ValueError, sim.disconnect)
       
        # Specify an invalid type, throw an error
        self.assertRaises(ValueError, sim.assign, "KnownInvalid")

        # Now that the type assignment has completed, connect will pass
        self.assertTrue(sim.assign("Stroker785L"))
        self.assertTrue(sim.connect())
    def test_wavenumber_conversion(self):
        # Set some default coefficients, make sure the returned
        # wavenumber conversion is accurate
        sim = SimulatedUSB()
        self.assertRaises(ValueError, sim.get_line_wavenumber)

        self.assertTrue(sim.assign("Stroker785L"))
        self.assertEqual(sim.pixel_count, 1024)
        wavenum_axis, intensity_data = sim.get_line_wavenumber()
        self.assertEqual(len(intensity_data), 1024)
        self.assertEqual(len(wavenum_axis), 1024)
  
        first_conv = "164.33"
        last_conv = "836.76"
        self.assertEqual("%05.2f" % wavenum_axis[0], first_conv)
        self.assertEqual("%05.2f" % wavenum_axis[-1], last_conv)
        self.assertEqual(intensity_data[0], 0)
        self.assertEqual(intensity_data[1023], 1023)
    def test_acquire_closes_window(self):
        # Simulated device is rquired
        sim_device = SimulatedUSB()
        sim_device.assign("Stroker785L")
        self.assertTrue(self.form.set_device(sim_device))
        self.form.ui.spinBoxIntegrationTime.setValue(3000)

        QtTest.QTest.mouseClick(self.form.ui.toolButtonAcquire,
            QtCore.Qt.LeftButton)
       
        # Wait 1 second, make sure lcd number values are 'around' the
        # appropriate range
        QtTest.QTest.qWait(1000)
        lcd_num = self.form.ui.lcdNumber.value()
        self.assertLess(lcd_num, 2500)
        self.assertGreater(lcd_num, 1500)

        QtTest.QTest.qWait(2500)
        self.assertFalse(self.form.isVisible())
    def test_get_line_of_data(self):
        # Create a device with 1024 simulated pixels
        sim = SimulatedUSB()
        self.assertRaises(ValueError, sim.get_line_pixel)

        self.assertTrue(sim.assign("Stroker785L"))
        self.assertEqual(sim.pixel_count, 1024)
        pixel_data = sim.get_line_pixel()
        self.assertEqual(len(pixel_data), 1024)
        self.assertEqual(pixel_data[0], 0)
        self.assertEqual(pixel_data[1023], 1023)

        # Check a device with 2048 pixels
        sim = SimulatedUSB()
        self.assertTrue(sim.assign("Stroker785M"))
        self.assertEqual(sim.pixel_count, 2048)
        pixel_data = sim.get_line_pixel()
        self.assertEqual(len(pixel_data), 2048)
        self.assertEqual(pixel_data[0], 0)
        self.assertEqual(pixel_data[2047], 2047)