blob: c7c524f7b37294eef135e5672b0caaf07359947e [file] [log] [blame]
import org.checkerframework.checker.units.qual.A;
import org.checkerframework.checker.units.qual.Acceleration;
import org.checkerframework.checker.units.qual.Area;
import org.checkerframework.checker.units.qual.C;
import org.checkerframework.checker.units.qual.Current;
import org.checkerframework.checker.units.qual.Force;
import org.checkerframework.checker.units.qual.K;
import org.checkerframework.checker.units.qual.Length;
import org.checkerframework.checker.units.qual.Luminance;
import org.checkerframework.checker.units.qual.Mass;
import org.checkerframework.checker.units.qual.N;
import org.checkerframework.checker.units.qual.Substance;
import org.checkerframework.checker.units.qual.Temperature;
import org.checkerframework.checker.units.qual.Time;
import org.checkerframework.checker.units.qual.cd;
import org.checkerframework.checker.units.qual.g;
import org.checkerframework.checker.units.qual.h;
import org.checkerframework.checker.units.qual.kN;
import org.checkerframework.checker.units.qual.kg;
import org.checkerframework.checker.units.qual.km;
import org.checkerframework.checker.units.qual.km2;
import org.checkerframework.checker.units.qual.km3;
import org.checkerframework.checker.units.qual.kmPERh;
import org.checkerframework.checker.units.qual.m;
import org.checkerframework.checker.units.qual.m2;
import org.checkerframework.checker.units.qual.m3;
import org.checkerframework.checker.units.qual.mPERs;
import org.checkerframework.checker.units.qual.mPERs2;
import org.checkerframework.checker.units.qual.min;
import org.checkerframework.checker.units.qual.mm;
import org.checkerframework.checker.units.qual.mm2;
import org.checkerframework.checker.units.qual.mm3;
import org.checkerframework.checker.units.qual.mol;
import org.checkerframework.checker.units.qual.s;
import org.checkerframework.checker.units.qual.t;
import org.checkerframework.checker.units.util.UnitsTools;
public class Addition {
// Addition 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;
// Cubic kilometer
@km3 int aCubicKilometer = 5 * UnitsTools.km3;
@km3 int bCubicKilometer = 5 * UnitsTools.km3;
@km3 int sCubicKilometer = aCubicKilometer + bCubicKilometer;
// 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;
// Cubic meter
@m3 int aCubicMeter = 5 * UnitsTools.m3;
@m3 int bCubicMeter = 5 * UnitsTools.m3;
@m3 int sCubicMeter = aCubicMeter + bCubicMeter;
// 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;
// Cubic millimeter
@mm3 int aCubicMillimeter = 5 * UnitsTools.mm3;
@mm3 int bCubicMillimeter = 5 * UnitsTools.mm3;
@mm3 int sCubicMillimeter = aCubicMillimeter + bCubicMillimeter;
// Mole
@mol int aMole = 5 * UnitsTools.mol;
@mol int bMole = 5 * UnitsTools.mol;
@mol int sMole = aMole + bMole;
// Newton
@N int aNewton = 5 * UnitsTools.N;
@N int bNewton = 5 * UnitsTools.N;
@N int sNewton = aNewton + bNewton;
// Kilonewton
@kN int aKilonewton = 5 * UnitsTools.kN;
@kN int bKilonewton = 5 * UnitsTools.kN;
@kN int sKilonewton = aKilonewton + bKilonewton;
// Second
@s int aSecond = 5 * UnitsTools.s;
@s int bSecond = 5 * UnitsTools.s;
@s int sSecond = aSecond + bSecond;
}
// Addition 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;
// Force
@Force int aForce = 5 * UnitsTools.N;
@Force int bForce = 5 * UnitsTools.N;
// 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
// Acceleration
// :: error: (assignment)
@Acceleration int sAcceleration = aAcceleration + bMass;
// Area
// :: error: (assignment)
@Luminance int sLuminance = aArea + bArea;
// Current
// :: error: (assignment)
@Current int sCurrent = aMass + bCurrent;
// Length
// :: error: (assignment)
@Length int sLength = aLength + bSubstance;
// Luminance
// :: error: (assignment)
@Temperature int sTemperature = aLuminance + bLuminance;
// Mass
// :: error: (assignment)
@Mass int sMass = aTemperature + bMass;
// Substance
// :: error: (assignment)
@Substance int sSubstance = aSubstance + bCurrent;
// Temperature
// :: error: (assignment)
@Area int sArea = aTemperature + bTemperature;
// Time
// :: error: (assignment)
@Time int sTime = aArea + bTime;
// Force
// :: error: (assignment)
sMass = aForce + bForce;
// 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;
// Metric Ton
@t int aMetricTon = 5 * UnitsTools.t;
@t int bMetricTon = 5 * UnitsTools.t;
// Newton
@N int aNewton = 5 * UnitsTools.N;
@N int bNewton = 5 * UnitsTools.N;
// Kilonewton
@kN int aKilonewton = 5 * UnitsTools.kN;
@kN int bKilonewton = 5 * UnitsTools.kN;
// Units
// Amperes
// :: error: (assignment)
@g int sGram = aAmpere + bAmpere;
// Candela
// :: error: (assignment)
@cd int sCandela = aTemperature + bCandela;
// Celsius
// :: error: (assignment)
@C int sCelsius = aCelsius + bMillimeter;
// Gram
// :: error: (assignment)
@kg int sKilogram = aGram + bGram;
// Hour
// :: error: (assignment)
@h int sHour = aSquareMeter + bHour;
// Kelvin
// :: error: (assignment)
@K int sKelvin = aKelvin + bSecond;
// Kilogram
// :: error: (assignment)
@kmPERh int sKilometerPerHour = aKilogram + bKilogram;
// Kilometer
// :: error: (assignment)
@km int sKilometer = aCandela + bKilometer;
// Square kilometer
// :: error: (assignment)
@km2 int sSquareKilometer = aSquareKilometer + bAmpere;
// Kilometer per hour
// :: error: (assignment)
@mPERs int sMeterPerSecond = aKilometerPerHour + bKilometerPerHour;
// Meter
// :: error: (assignment)
@m int sMeter = aHour + bMeter;
// Square meter
// :: error: (assignment)
@m2 int sSquareMeter = aSquareMeter + bGram;
// Meter per second
// :: error: (assignment)
@mm2 int sSquareMillimeter = aMeterPerSecond + bMeterPerSecond;
// Meter per second square
// :: error: (assignment)
@mPERs2 int sMeterPerSecondSquare = aMeterPerSecondSquare + bMeter;
// Minute
// :: error: (assignment)
@min int sMinute = aMole + bMinute;
// Millimeter
// :: error: (assignment)
@mm int sMillimeter = aMillimeter + bHour;
// Square millimeter
// :: error: (assignment)
@A int sAmpere = aSquareMillimeter + bSquareMillimeter;
// Mole
// :: error: (assignment)
@mol int sMole = aCandela + bMole;
// Second
// :: error: (assignment)
@s int sSecond = aSecond + bSquareKilometer;
// Newton
// :: error: (assignment)
sKilogram = aNewton + bNewton;
// Kilonewton
// :: error: (assignment)
@kN int sKilonewton = aKilonewton + bNewton;
// Metric Ton
// :: error: (assignment)
@N int sNewton = aNewton + bMetricTon;
}
}