/**
  * Constructs a {@link VariableEntry} with retrieved values from the given patient and asserts
  * that it contains the expected dynamic values.
  */
 private void verifyRetrievedValue(
     final Collection<? extends Variable> vars,
     final Patient patient,
     final Map<String, String> expectedValues) {
   final VariableEntry actualVariableEntry = VariableEntry.withRetrievedValues(vars, patient);
   assertEquals(expectedValues, actualVariableEntry.getDynamicValues());
 }
  /**
   * A simplification of the above {@link #verifyRetrievedValue(Collection, Patient, Map)} to
   * facilitate testing with a {@link RetrievedValue} object.
   */
  private void verifyRetrievedValue(
      final DiscreteNumericalVariable var,
      final Patient patient,
      final RetrievedValue retrievedValue) {
    final Collection<DiscreteNumericalVariable> vars = ImmutableSet.of(var);
    // Use VariableEntry to generate the expected dynamic values.
    final VariableEntry expected =
        new VariableEntry(vars)
            .putRetrievedValue(VariableEntry.makeNumericalInputName(var.getKey()), retrievedValue);

    verifyRetrievedValue(vars, patient, expected.getDynamicValues());
  }
  @Test
  public final void testWithRetrievedLabs() {
    final List<AbstractVariable> vars = new ArrayList<AbstractVariable>();
    final Patient patient = SampleCalculations.dummyPatientWithLabs(1);

    // Note that vars is empty at this point.
    final VariableEntry expected = new VariableEntry(vars);

    addAllLabs(expected, vars, patient);
    final VariableEntry entry = VariableEntry.withRetrievedValues(vars, patient);
    assertEquals(expected.getDynamicValues(), entry.getDynamicValues());
  }
  @Test
  public final void testCardiacAge() {
    final DiscreteNumericalVariable var = SampleModels.cardiacAgeVariable();
    final Patient patient = SampleCalculations.dummyPatientWithVitals(1);
    final Collection<DiscreteNumericalVariable> vars = ImmutableSet.of(var);
    // Use VariableEntry to generate the expected dynamic values.
    final VariableEntry expected =
        new VariableEntry(vars)
            .putDynamicValue(
                VariableEntry.makeNumericalInputName(var.getKey()),
                String.valueOf(patient.getAge()));

    verifyRetrievedValue(vars, patient, expected.getDynamicValues());
  }
  /**
   * This method adds all of the necessary information for the lab variables to the expected map so
   * the values can be compared later.
   *
   * @param expected [out] to populate expected dynamic values
   * @param vars [out] a list of AbstractVariables needed for the calculation
   * @param patient the patient for the current calculation
   */
  private void addAllLabs(
      final VariableEntry expected, final List<AbstractVariable> vars, final Patient patient) {
    for (final String key : LAB_MAP.keySet()) {
      // Warning: semantic coupling. Simluate what VariableEntry would do if we
      // constructed it using the variable list.
      expected.putDynamicValue(key, VariableEntry.SPECIAL_NUMERICAL);
      final ValueRetriever retriever = LAB_MAP.get(key);
      vars.add(makeDiscreteNumerical(key, retriever));
      final RetrievedValue labValue = patient.getLabs().get(VistaLabs.valueOf(retriever.name()));

      final String inputKey = VariableEntry.makeNumericalInputName(key);
      expected.putRetrievedValue(inputKey, labValue);
    }
  }