Dimensional.cs 3.6 KB

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