import org.checkerframework.checker.units.UnitsTools;
import org.checkerframework.checker.units.qual.*;
public class Subtraction {
// Subtraction is legal when the operands have the same units.
void good() {
// Units
// Amperes
@A int aAmpere = 5 * UnitsTools.A;
@A int bAmpere = 5 * UnitsTools.A;
@A int sAmpere = aAmpere - bAmpere;
// Candela
@cd int aCandela = 5 * UnitsTools.cd;
@cd int bCandela = 5 * UnitsTools.cd;
@cd int sCandela = aCandela - bCandela;
// Celsius
@C int aCelsius = 5 * UnitsTools.C;
@C int bCelsius = 5 * UnitsTools.C;
@C int sCelsius = aCelsius - bCelsius;
// Gram
@g int aGram = 5 * UnitsTools.g;
@g int bGram = 5 * UnitsTools.g;
@g int sGram = aGram - bGram;
// Hour
@h int aHour = 5 * UnitsTools.h;
@h int bHour = 5 * UnitsTools.h;
@h int sHour = aHour - bHour;
// Kelvin
@K int aKelvin = 5 * UnitsTools.K;
@K int bKelvin = 5 * UnitsTools.K;
@K int sKelvin = aKelvin - bKelvin;
// Kilogram
@kg int aKilogram = 5 * UnitsTools.kg;
@kg int bKilogram = 5 * UnitsTools.kg;
@kg int sKilogram = aKilogram - bKilogram;
// Kilometer
@km int aKilometer = 5 * UnitsTools.km;
@km int bKilometer = 5 * UnitsTools.km;
@km int sKilometer = aKilometer - bKilometer;
// Square kilometer
@km2 int aSquareKilometer = 5 * UnitsTools.km2;
@km2 int bSquareKilometer = 5 * UnitsTools.km2;
@km2 int sSquareKilometer = aSquareKilometer - bSquareKilometer;
// Kilometer per hour
@kmPERh int aKilometerPerHour = 5 * UnitsTools.kmPERh;
@kmPERh int bKilometerPerHour = 5 * UnitsTools.kmPERh;
@kmPERh int sKilometerPerHour = aKilometerPerHour - bKilometerPerHour;
// Meter
@m int aMeter = 5 * UnitsTools.m;
@m int bMeter = 5 * UnitsTools.m;
@m int sMeter = aMeter - bMeter;
// Square meter
@m2 int aSquareMeter = 5 * UnitsTools.m2;
@m2 int bSquareMeter = 5 * UnitsTools.m2;
@m2 int sSquareMeter = aSquareMeter - bSquareMeter;
// Meter per second
@mPERs int aMeterPerSecond = 5 * UnitsTools.mPERs;
@mPERs int bMeterPerSecond = 5 * UnitsTools.mPERs;
@mPERs int sMeterPerSecond = aMeterPerSecond - bMeterPerSecond;
// Meter per second square
@mPERs2 int aMeterPerSecondSquare = 5 * UnitsTools.mPERs2;
@mPERs2 int bMeterPerSecondSquare = 5 * UnitsTools.mPERs2;
@mPERs2 int sMeterPerSecondSquare = aMeterPerSecondSquare - bMeterPerSecondSquare;
// Minute
@min int aMinute = 5 * UnitsTools.min;
@min int bMinute = 5 * UnitsTools.min;
@min int sMinute = aMinute - bMinute;
// Millimeter
@mm int aMillimeter = 5 * UnitsTools.mm;
@mm int bMillimeter = 5 * UnitsTools.mm;
@mm int sMillimeter = aMillimeter - bMillimeter;
// Square millimeter
@mm2 int aSquareMillimeter = 5 * UnitsTools.mm2;
@mm2 int bSquareMillimeter = 5 * UnitsTools.mm2;
@mm2 int sSquareMillimeter = aSquareMillimeter - bSquareMillimeter;
// Mole
@mol int aMole = 5 * UnitsTools.mol;
@mol int bMole = 5 * UnitsTools.mol;
@mol int sMole = aMole - bMole;
// Second
@s int aSecond = 5 * UnitsTools.s;
@s int bSecond = 5 * UnitsTools.s;
@s int sSecond = aSecond - bSecond;
}
// Subtraction is illegal when the operands have different units or one
// is unqualified. In these tests, we cycle between the result and
// the first or second operand having an incorrect type.
void bad() {
// Dimensions
// Acceleration
@Acceleration int aAcceleration = 5 * UnitsTools.mPERs2;
@Acceleration int bAcceleration = 5 * UnitsTools.mPERs2;
// Area
@Area int aArea = 5 * UnitsTools.km2;
@Area int bArea = 5 * UnitsTools.mm2;
// Current
@Current int aCurrent = 5 * UnitsTools.A;
@Current int bCurrent = 5 * UnitsTools.A;
// Length
@Length int aLength = 5 * UnitsTools.m;
@Length int bLength = 5 * UnitsTools.mm;
// Luminance
@Luminance int aLuminance = 5 * UnitsTools.cd;
@Luminance int bLuminance = 5 * UnitsTools.cd;
// Mass
@Mass int aMass = 5 * UnitsTools.kg;
@Mass int bMass = 5 * UnitsTools.g;
// Substance
@Substance int aSubstance = 5 * UnitsTools.mol;
@Substance int bSubstance = 5 * UnitsTools.mol;
// Temperature
@Temperature int aTemperature = 5 * UnitsTools.K;
@Temperature int bTemperature = 5 * UnitsTools.K;
// Time
@Time int aTime = 5 * UnitsTools.min;
@Time int bTime = 5 * UnitsTools.h;
// Dimensions
//:: error: (assignment.type.incompatible)
@Acceleration int sAcceleration = aAcceleration - bMass;
// Area
//:: error: (assignment.type.incompatible)
@Luminance int sLuminance = aArea - bArea;
// Current
//:: error: (assignment.type.incompatible)
@Current int sCurrent = aMass - bCurrent;
// Length
//:: error: (assignment.type.incompatible)
@Length int sLength = aLength - bSubstance;
// Luminance
//:: error: (assignment.type.incompatible)
@Temperature int sTemperature = aLuminance - bLuminance;
// Mass
//:: error: (assignment.type.incompatible)
@Mass int sMass = aTemperature - bMass;
// Substance
//:: error: (assignment.type.incompatible)
@Substance int sSubstance = aSubstance - bCurrent;
// Temperature
//:: error: (assignment.type.incompatible)
@Area int sArea = aTemperature - bTemperature;
// Time
//:: error: (assignment.type.incompatible)
@Time int sTime = aArea - bTime;
// Units
// Amperes
@A int aAmpere = 5 * UnitsTools.A;
@A int bAmpere = 5 * UnitsTools.A;
// Candela
@cd int aCandela = 5 * UnitsTools.cd;
@cd int bCandela = 5 * UnitsTools.cd;
// Celsius
@C int aCelsius = 5 * UnitsTools.C;
@C int bCelsius = 5 * UnitsTools.C;
// Gram
@g int aGram = 5 * UnitsTools.g;
@g int bGram = 5 * UnitsTools.g;
// Hour
@h int aHour = 5 * UnitsTools.h;
@h int bHour = 5 * UnitsTools.h;
// Kelvin
@K int aKelvin = 5 * UnitsTools.K;
@K int bKelvin = 5 * UnitsTools.K;
// Kilogram
@kg int aKilogram = 5 * UnitsTools.kg;
@kg int bKilogram = 5 * UnitsTools.kg;
// Kilometer
@km int aKilometer = 5 * UnitsTools.km;
@km int bKilometer = 5 * UnitsTools.km;
// Square kilometer
@km2 int aSquareKilometer = 5 * UnitsTools.km2;
@km2 int bSquareKilometer = 5 * UnitsTools.km2;
// Kilometer per hour
@kmPERh int aKilometerPerHour = 5 * UnitsTools.kmPERh;
@kmPERh int bKilometerPerHour = 5 * UnitsTools.kmPERh;
// Meter
@m int aMeter = 5 * UnitsTools.m;
@m int bMeter = 5 * UnitsTools.m;
// Square meter
@m2 int aSquareMeter = 5 * UnitsTools.m2;
@m2 int bSquareMeter = 5 * UnitsTools.m2;
// Meter per second
@mPERs int aMeterPerSecond = 5 * UnitsTools.mPERs;
@mPERs int bMeterPerSecond = 5 * UnitsTools.mPERs;
// Meter per second square
@mPERs2 int aMeterPerSecondSquare = 5 * UnitsTools.mPERs2;
@mPERs2 int bMeterPerSecondSquare = 5 * UnitsTools.mPERs2;
// Minute
@min int aMinute = 5 * UnitsTools.min;
@min int bMinute = 5 * UnitsTools.min;
// Millimeter
@mm int aMillimeter = 5 * UnitsTools.mm;
@mm int bMillimeter = 5 * UnitsTools.mm;
// Square millimeter
@mm2 int aSquareMillimeter = 5 * UnitsTools.mm2;
@mm2 int bSquareMillimeter = 5 * UnitsTools.mm2;
// Mole
@mol int aMole = 5 * UnitsTools.mol;
@mol int bMole = 5 * UnitsTools.mol;
// Second
@s int aSecond = 5 * UnitsTools.s;
@s int bSecond = 5 * UnitsTools.s;
// Units
// Amperes
//:: error: (assignment.type.incompatible)
@g int sGram = aAmpere - bAmpere;
// Candela
//:: error: (assignment.type.incompatible)
@cd int sCandela = aTemperature - bCandela;
// Celsius
//:: error: (assignment.type.incompatible)
@C int sCelsius = aCelsius - bMillimeter;
// Gram
//:: error: (assignment.type.incompatible)
@kg int sKilogram = aGram - bGram;
// Hour
//:: error: (assignment.type.incompatible)
@h int sHour = aSquareMeter - bHour;
// Kelvin
//:: error: (assignment.type.incompatible)
@K int sKelvin = aKelvin - bSecond;
// Kilogram
//:: error: (assignment.type.incompatible)
@kmPERh int sKilometerPerHour = aKilogram - bKilogram;
// Kilometer
//:: error: (assignment.type.incompatible)
@km int sKilometer = aCandela - bKilometer;
// Square kilometer
//:: error: (assignment.type.incompatible)
@km2 int sSquareKilometer = aSquareKilometer - bAmpere;
// Kilometer per hour
//:: error: (assignment.type.incompatible)
@mPERs int sMeterPerSecond = aKilometerPerHour - bKilometerPerHour;
// Meter
//:: error: (assignment.type.incompatible)
@m int sMeter = aHour - bMeter;
// Square meter
//:: error: (assignment.type.incompatible)
@m2 int sSquareMeter = aSquareMeter - bGram;
// Meter per second
//:: error: (assignment.type.incompatible)
@mm2 int sSquareMillimeter = aMeterPerSecond - bMeterPerSecond;
// Meter per second square
//:: error: (assignment.type.incompatible)
@mPERs2 int sMeterPerSecondSquare = aMeterPerSecondSquare - bMeter;
// Minute
//:: error: (assignment.type.incompatible)
@min int sMinute = aMole - bMinute;
// Millimeter
//:: error: (assignment.type.incompatible)
@mm int sMillimeter = aMillimeter - bHour;
// Square millimeter
//:: error: (assignment.type.incompatible)
@A int sAmpere = aSquareMillimeter - bSquareMillimeter;
// Mole
//:: error: (assignment.type.incompatible)
@mol int sMole = aCandela - bMole;
// Second
//:: error: (assignment.type.incompatible)
@s int sSecond = aSecond - bSquareKilometer;
}
}