public void testRead() {

    CompositeVariableValue testVar = createTestVar();

    // set initial value
    ((JComboBox<?>) testVar.getCommonRep()).setSelectedIndex(1);

    // register a listener for parameter changes
    java.beans.PropertyChangeListener listen =
        new java.beans.PropertyChangeListener() {
          public void propertyChange(java.beans.PropertyChangeEvent e) {
            evtList.add(e);
            if (e.getPropertyName().equals("Busy")
                && ((Boolean) e.getNewValue()).equals(Boolean.FALSE)) {
              log.debug("=============== Busy false seen in test scaffold =================");
            }
          }
        };
    evtList = new ArrayList<java.beans.PropertyChangeEvent>();
    testVar.addPropertyChangeListener(listen);

    // execute the test read
    log.debug("============ execute test read ===========");
    testVar.setToRead(true);
    testVar.readAll();
    log.debug("============ end test read ===============");

    // wait for reply (normally, done by callback; will check that later)
    JUnitUtil.waitFor(
        () -> {
          return !testVar.isBusy();
        },
        "testVar.isBusy");

    int nBusyFalse = 0;
    for (int k = 0; k < evtList.size(); k++) {
      java.beans.PropertyChangeEvent e = evtList.get(k);
      if (e.getPropertyName().equals("Busy") && ((Boolean) e.getNewValue()).equals(Boolean.FALSE)) {
        nBusyFalse++;
      }
    }
    log.debug("checks");
    Assert.assertEquals("exactly one Busy -> false transition ", 1, nBusyFalse);

    Assert.assertEquals("CV 17 value ", 123, cv17.getValue());
    Assert.assertEquals("CV 18 value ", 123, cv18.getValue());
    Assert.assertEquals("CV 19 value ", 123, cv19.getValue());
    Assert.assertEquals(
        "var value after read", 2, ((JComboBox<?>) testVar.getCommonRep()).getSelectedIndex());
    Assert.assertEquals("Var state", AbstractValue.READ, testVar.getState());
    log.debug("end testRead");
  }
  // can we change the CVs and see the result in the Variable?
  public void testValueFromCV() {

    CompositeVariableValue testVar = createTestVar();

    // set value
    ((JComboBox<?>) testVar.getCommonRep()).setSelectedIndex(1);

    // set the CVs
    cv17.setValue(11);
    cv18.setValue(12);
    cv19.setValue(13);

    // check for change
    Assert.assertEquals(
        "composite index when set to first via CV",
        0,
        ((JComboBox<?>) testVar.getCommonRep()).getSelectedIndex());
  }
  public void testIsChanged() {

    CompositeVariableValue testVar = createTestVar();

    // initially, nobody changed
    Assert.assertEquals("main not changed initially", false, testVar.isChanged());
    Assert.assertEquals("Var 17 not changed initially ", false, var17.isChanged());

    // set value value
    ((JComboBox<?>) testVar.getCommonRep()).setSelectedIndex(1);

    // now changed, check
    Assert.assertEquals("Var 17 changed ", true, var17.isChanged());
    Assert.assertEquals("main changed", true, testVar.isChanged());
  }
  // rest of tests are new, for just this type of variable
  // can we create three variables, then manipulate the composite variable to change them?
  public void testCompositeCreateAndSet() {

    CompositeVariableValue testVar = createTestVar();

    // set value
    ((JComboBox<?>) testVar.getCommonRep()).setSelectedIndex(1);

    // see if the variables were updated
    Assert.assertEquals("var17 value when set to second", 21, var17.getIntValue());
    Assert.assertEquals("var18 value when set to second", 22, var18.getIntValue());
    Assert.assertEquals("var19 value when set to second", 23, var19.getIntValue());

    // see if the CVs were updated
    Assert.assertEquals("cv17 value when set to second", 21, cv17.getValue());
    Assert.assertEquals("cv18 value when set to second", 22, cv18.getValue());
    Assert.assertEquals("cv19 value when set to second", 23, cv19.getValue());
  }