Dimensional.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. namespace Jint.Tests.Runtime.Domain;
  2. public class Dimensional : IComparable<Dimensional>, IEquatable<Dimensional>
  3. {
  4. private readonly MeasureUnit[] PossibleMeasureUnits = new MeasureUnit[] { new MeasureUnit("Mass", "kg", 1.0), new MeasureUnit("Mass", "gr", 0.001), new MeasureUnit("Count", "piece", 1.0) };
  5. public MeasureUnit MeasureUnit { get; private set; }
  6. public double Value { get; private set; }
  7. public double NormalizatedValue
  8. {
  9. get
  10. {
  11. return Value * MeasureUnit.RelativeValue;
  12. }
  13. }
  14. public Dimensional(string measureUnit, double value)
  15. {
  16. MeasureUnit = GetMeasureUnitByName(measureUnit);
  17. Value = value;
  18. }
  19. public static Dimensional operator +(Dimensional left, Dimensional right)
  20. {
  21. if (left.MeasureUnit.MeasureType != right.MeasureUnit.MeasureType)
  22. throw new InvalidOperationException("Dimensionals with different measure types are non-summable");
  23. return new Dimensional(left.MeasureUnit.RelativeValue <= right.MeasureUnit.RelativeValue ? left.MeasureUnit.Name : right.MeasureUnit.Name,
  24. left.Value * left.MeasureUnit.RelativeValue + right.Value * right.MeasureUnit.RelativeValue);
  25. }
  26. private MeasureUnit GetMeasureUnitByName(string name)
  27. {
  28. return PossibleMeasureUnits.FirstOrDefault(mu => mu.Name == name);
  29. }
  30. public int CompareTo(Dimensional obj)
  31. {
  32. if (MeasureUnit.MeasureType != obj.MeasureUnit.MeasureType)
  33. throw new InvalidOperationException("Dimensionals with different measure types are non-comparable");
  34. return NormalizatedValue.CompareTo(obj.NormalizatedValue);
  35. }
  36. public override string ToString()
  37. {
  38. return Value + " " + MeasureUnit.Name;
  39. }
  40. public bool Equals(Dimensional other)
  41. {
  42. if (ReferenceEquals(null, other))
  43. {
  44. return false;
  45. }
  46. if (ReferenceEquals(this, other))
  47. {
  48. return true;
  49. }
  50. return Value.Equals(other.Value) && Equals(MeasureUnit, other.MeasureUnit);
  51. }
  52. public override bool Equals(object obj)
  53. {
  54. return Equals(obj as Dimensional);
  55. }
  56. public override int GetHashCode()
  57. {
  58. return Value.GetHashCode();
  59. }
  60. }
  61. public class MeasureUnit : IEquatable<MeasureUnit>
  62. {
  63. public string MeasureType { get; set; }
  64. public string Name { get; set; }
  65. public double RelativeValue { get; set; }
  66. public MeasureUnit(string measureType, string name, double relativeValue)
  67. {
  68. this.MeasureType = measureType;
  69. this.Name = name;
  70. this.RelativeValue = relativeValue;
  71. }
  72. public bool Equals(MeasureUnit other)
  73. {
  74. if (ReferenceEquals(null, other))
  75. {
  76. return false;
  77. }
  78. if (ReferenceEquals(this, other))
  79. {
  80. return true;
  81. }
  82. return MeasureType == other.MeasureType && Name == other.Name && RelativeValue.Equals(other.RelativeValue);
  83. }
  84. public override bool Equals(object obj)
  85. {
  86. return Equals(obj as MeasureUnit);
  87. }
  88. public override int GetHashCode()
  89. {
  90. return MeasureType.GetHashCode() ^ Name.GetHashCode() ^ RelativeValue.GetHashCode();
  91. }
  92. }