public static int compare(String unitA, long valueA, String unitB,
      long valueB) {
    checkUnitArgument(unitA);
    checkUnitArgument(unitB);
    if (unitA.equals(unitB)) {
      return Long.compare(valueA, valueB);
    }
    Converter unitAC = getConverter(unitA);
    Converter unitBC = getConverter(unitB);
    int unitAPos = SORTED_UNITS.indexOf(unitA);
    int unitBPos = SORTED_UNITS.indexOf(unitB);
    try {
      long tmpA = valueA;
      long tmpB = valueB;
      if (unitAPos < unitBPos) {
        tmpB = convert(unitB, unitA, valueB);
      } else {
        tmpA = convert(unitA, unitB, valueA);
      }
      return Long.compare(tmpA, tmpB);
    } catch (IllegalArgumentException ie) {
      BigInteger tmpA = BigInteger.valueOf(valueA);
      BigInteger tmpB = BigInteger.valueOf(valueB);
      if (unitAPos < unitBPos) {
        tmpB = tmpB.multiply(BigInteger.valueOf(unitBC.numerator));
        tmpB = tmpB.multiply(BigInteger.valueOf(unitAC.denominator));
        tmpB = tmpB.divide(BigInteger.valueOf(unitBC.denominator));
        tmpB = tmpB.divide(BigInteger.valueOf(unitAC.numerator));
      } else {
        tmpA = tmpA.multiply(BigInteger.valueOf(unitAC.numerator));
        tmpA = tmpA.multiply(BigInteger.valueOf(unitBC.denominator));
        tmpA = tmpA.divide(BigInteger.valueOf(unitAC.denominator));
        tmpA = tmpA.divide(BigInteger.valueOf(unitBC.numerator));
      }
      return tmpA.compareTo(tmpB);
    }
  }
@Test
  void testCompare() {
    String unitA = "P";
    long valueA = 1;
    String unitB = "p";
    long valueB = 2;
    assertEquals(1,
        UnitsConversionUtil.compare(unitA, valueA, unitB, valueB));
    assertEquals(-1,
        UnitsConversionUtil.compare(unitB, valueB, unitA, valueA));
    assertEquals(0,
        UnitsConversionUtil.compare(unitA, valueA, unitA, valueA));
    assertEquals(-1,
        UnitsConversionUtil.compare(unitA, valueA, unitA, valueB));
    assertEquals(1,
        UnitsConversionUtil.compare(unitA, valueB, unitA, valueA));

    unitB = "T";
    assertEquals(1,
        UnitsConversionUtil.compare(unitA, valueA, unitB, valueB));
    assertEquals(-1,
        UnitsConversionUtil.compare(unitB, valueB, unitA, valueA));
    assertEquals(0,
        UnitsConversionUtil.compare(unitA, valueA, unitB, 1000L));

    unitA = "p";
    unitB = "n";
    assertEquals(-1,
        UnitsConversionUtil.compare(unitA, valueA, unitB, valueB));
    assertEquals(1,
        UnitsConversionUtil.compare(unitB, valueB, unitA, valueA));
    assertEquals(0,
        UnitsConversionUtil.compare(unitA, 1000L, unitB, valueA));

  }