Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 87 additions & 87 deletions EliteAPI.Tests/FlatteningTests.cs

Large diffs are not rendered by default.

92 changes: 46 additions & 46 deletions EliteAPI.Tests/StatusTrackerTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using EliteAPI.Events;
using EliteAPI.Journals;
using FluentAssertions;
using ValueType = EliteAPI.Events.ValueType;
using EventValueType = EliteAPI.Events.EventValueType;

namespace EliteAPI.Tests;

Expand All @@ -15,16 +15,16 @@ public void DetectsFieldChange_WhenBooleanValueChanges()
// First update: Gear is false
var initialPaths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean),
new("EliteAPI.Hardpoints", false, ValueType.Boolean)
new("EliteAPI.Gear", false, EventValueType.Boolean),
new("EliteAPI.Hardpoints", false, EventValueType.Boolean)
};
tracker.UpdateState(initialPaths);

// Second update: Gear changes to true
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Gear", true, ValueType.Boolean),
new("EliteAPI.Hardpoints", false, ValueType.Boolean)
new("EliteAPI.Gear", true, EventValueType.Boolean),
new("EliteAPI.Hardpoints", false, EventValueType.Boolean)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -41,16 +41,16 @@ public void DetectsFieldChange_WhenNumericValueChanges()
// First update: GuiFocus is 0
var initialPaths = new List<EventPath>
{
new("EliteAPI.GuiFocus", 0, ValueType.Number),
new("EliteAPI.FireGroup", 1, ValueType.Number)
new("EliteAPI.GuiFocus", 0, EventValueType.Number),
new("EliteAPI.FireGroup", 1, EventValueType.Number)
};
tracker.UpdateState(initialPaths);

// Second update: GuiFocus changes to 3
var updatedPaths = new List<EventPath>
{
new("EliteAPI.GuiFocus", 3, ValueType.Number),
new("EliteAPI.FireGroup", 1, ValueType.Number)
new("EliteAPI.GuiFocus", 3, EventValueType.Number),
new("EliteAPI.FireGroup", 1, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -67,16 +67,16 @@ public void DetectsFieldChange_WhenDecimalValueChanges()
// First update: FuelMain is 32.0
var initialPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 32.0m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, ValueType.Decimal)
new("EliteAPI.Fuel.FuelMain", 32.0m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, EventValueType.Decimal)
};
tracker.UpdateState(initialPaths);

// Second update: FuelMain changes to 31.5
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 31.5m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, ValueType.Decimal)
new("EliteAPI.Fuel.FuelMain", 31.5m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, EventValueType.Decimal)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -94,18 +94,18 @@ public void DetectsMultipleFieldChanges()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean),
new("EliteAPI.Hardpoints", false, ValueType.Boolean),
new("EliteAPI.GuiFocus", 0, ValueType.Number)
new("EliteAPI.Gear", false, EventValueType.Boolean),
new("EliteAPI.Hardpoints", false, EventValueType.Boolean),
new("EliteAPI.GuiFocus", 0, EventValueType.Number)
};
tracker.UpdateState(initialPaths);

// Second update: Multiple fields change
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Gear", true, ValueType.Boolean),
new("EliteAPI.Hardpoints", true, ValueType.Boolean),
new("EliteAPI.GuiFocus", 0, ValueType.Number)
new("EliteAPI.Gear", true, EventValueType.Boolean),
new("EliteAPI.Hardpoints", true, EventValueType.Boolean),
new("EliteAPI.GuiFocus", 0, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -123,16 +123,16 @@ public void ReturnsEmptyList_WhenNoFieldsChange()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean),
new("EliteAPI.GuiFocus", 0, ValueType.Number)
new("EliteAPI.Gear", false, EventValueType.Boolean),
new("EliteAPI.GuiFocus", 0, EventValueType.Number)
};
tracker.UpdateState(initialPaths);

// Second update: Same values
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean),
new("EliteAPI.GuiFocus", 0, ValueType.Number)
new("EliteAPI.Gear", false, EventValueType.Boolean),
new("EliteAPI.GuiFocus", 0, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -148,9 +148,9 @@ public void ReturnsEmptyList_OnFirstUpdate()
// First update (no previous state)
var paths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean),
new("EliteAPI.Hardpoints", false, ValueType.Boolean),
new("EliteAPI.GuiFocus", 0, ValueType.Number)
new("EliteAPI.Gear", false, EventValueType.Boolean),
new("EliteAPI.Hardpoints", false, EventValueType.Boolean),
new("EliteAPI.GuiFocus", 0, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(paths);
Expand All @@ -167,18 +167,18 @@ public void ExtractsRootFieldName_FromNestedPath()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 32.0m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, ValueType.Decimal),
new("EliteAPI.Destination.System", 123456789L, ValueType.Number)
new("EliteAPI.Fuel.FuelMain", 32.0m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, EventValueType.Decimal),
new("EliteAPI.Destination.System", 123456789L, EventValueType.Number)
};
tracker.UpdateState(initialPaths);

// Second update: Change nested field
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 31.0m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.4m, ValueType.Decimal),
new("EliteAPI.Destination.System", 987654321L, ValueType.Number)
new("EliteAPI.Fuel.FuelMain", 31.0m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.4m, EventValueType.Decimal),
new("EliteAPI.Destination.System", 987654321L, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -197,16 +197,16 @@ public void OnlyReportsRootFieldOnce_WhenMultipleSubfieldsChange()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 32.0m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, ValueType.Decimal)
new("EliteAPI.Fuel.FuelMain", 32.0m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.5m, EventValueType.Decimal)
};
tracker.UpdateState(initialPaths);

// Second update: Both Fuel subfields change
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Fuel.FuelMain", 31.0m, ValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.4m, ValueType.Decimal)
new("EliteAPI.Fuel.FuelMain", 31.0m, EventValueType.Decimal),
new("EliteAPI.Fuel.FuelReservoir", 0.4m, EventValueType.Decimal)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -224,14 +224,14 @@ public void HandlesStringValueChanges()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.LegalState", "Clean", ValueType.String)
new("EliteAPI.LegalState", "Clean", EventValueType.String)
};
tracker.UpdateState(initialPaths);

// Second update: LegalState changes
var updatedPaths = new List<EventPath>
{
new("EliteAPI.LegalState", "Wanted", ValueType.String)
new("EliteAPI.LegalState", "Wanted", EventValueType.String)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -248,18 +248,18 @@ public void HandlesPipsArrayChanges()
// First update
var initialPaths = new List<EventPath>
{
new("EliteAPI.Pips.Systems", 2, ValueType.Number),
new("EliteAPI.Pips.Engines", 8, ValueType.Number),
new("EliteAPI.Pips.Weapons", 2, ValueType.Number)
new("EliteAPI.Pips.Systems", 2, EventValueType.Number),
new("EliteAPI.Pips.Engines", 8, EventValueType.Number),
new("EliteAPI.Pips.Weapons", 2, EventValueType.Number)
};
tracker.UpdateState(initialPaths);

// Second update: Pips change
var updatedPaths = new List<EventPath>
{
new("EliteAPI.Pips.Systems", 4, ValueType.Number),
new("EliteAPI.Pips.Engines", 4, ValueType.Number),
new("EliteAPI.Pips.Weapons", 4, ValueType.Number)
new("EliteAPI.Pips.Systems", 4, EventValueType.Number),
new("EliteAPI.Pips.Engines", 4, EventValueType.Number),
new("EliteAPI.Pips.Weapons", 4, EventValueType.Number)
};

var changedFields = tracker.GetChangedFieldNames(updatedPaths);
Expand All @@ -277,7 +277,7 @@ public void IsThreadSafe_WhenAccessedConcurrently()
// Initialize
var initialPaths = new List<EventPath>
{
new("EliteAPI.Gear", false, ValueType.Boolean)
new("EliteAPI.Gear", false, EventValueType.Boolean)
};
tracker.UpdateState(initialPaths);

Expand All @@ -290,7 +290,7 @@ public void IsThreadSafe_WhenAccessedConcurrently()
{
var paths = new List<EventPath>
{
new("EliteAPI.Gear", value, ValueType.Boolean)
new("EliteAPI.Gear", value, EventValueType.Boolean)
};
tracker.GetChangedFieldNames(paths);
tracker.UpdateState(paths);
Expand Down
2 changes: 2 additions & 0 deletions EliteAPI/EliteDangerousApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,8 @@ internal void Invoke(string json, IEvent? @event)

private void HandleBindingsPreset(string presetContent)
{
// look at the preset that occurs the most

var presets = presetContent.Split('\n').Where(line => !string.IsNullOrWhiteSpace(line)).ToList();

// Make sure all presets use the same format
Expand Down
23 changes: 20 additions & 3 deletions EliteAPI/Events/EventPath.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,39 @@

using System;
using System.Runtime.CompilerServices;

namespace EliteAPI.Events;

public readonly struct EventPath(string path, dynamic value, ValueType type)
public readonly struct EventPath(string path, dynamic value, EventValueType type)
{
public string Path { get; init; } = path;

public dynamic Value { get; init; } = value;

public ValueType Type { get; init; } = type;
public EventValueType Type { get; init; } = type;

internal EventPath WithPath(string path) => new(path.Replace("..", "."), Value, Type);
}

public enum ValueType
public enum EventValueType
{
String,
Number,
Decimal,
Boolean,
DateTime,
}


public static class EventUtils
{
public static string ToDisplayType(this EventValueType valueType) => valueType switch
{
EventValueType.String => "TXT",
EventValueType.Number => "INT",
EventValueType.Decimal => "DEC",
EventValueType.Boolean => "BOOL",
EventValueType.DateTime => "DATE",
_ => "",
};
}
8 changes: 4 additions & 4 deletions EliteAPI/Journals/JournalUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
using System.Text.RegularExpressions;
using EliteAPI.Events;
using EliteAPI.Json;
using ValueType = EliteAPI.Events.ValueType;
using EventValueType = EliteAPI.Events.EventValueType;

namespace EliteAPI.Journals;

Expand All @@ -29,13 +29,13 @@ public static List<EventPath> ToPaths(string json)
var flagsPath = paths.FirstOrDefault(p => p.Path == "Flags");
var flagsValue = flagsPath.Equals(default(EventPath)) ? 0 : Convert.ToInt32(flagsPath.Value);
foreach (var flag in StatusUtils.GetFlags(flagsValue))
paths.Add(new EventPath(flag.Key, flag.Value, ValueType.Boolean));
paths.Add(new EventPath(flag.Key, flag.Value, EventValueType.Boolean));

// expand flags2
var flags2Path = paths.FirstOrDefault(p => p.Path == "Flags2");
var flags2Value = flags2Path.Equals(default(EventPath)) ? 0 : Convert.ToInt32(flags2Path.Value);
foreach (var flag in StatusUtils.GetFlags2(flags2Value))
paths.Add(new EventPath(flag.Key, flag.Value, ValueType.Boolean));
paths.Add(new EventPath(flag.Key, flag.Value, EventValueType.Boolean));

// replace pips array with individual pips
paths.Add(paths.FirstOrDefault(p => p.Path == "Pips[0]").WithPath("Pips.Systems"));
Expand All @@ -47,7 +47,7 @@ public static List<EventPath> ToPaths(string json)
if (!balancePath.Equals(default(EventPath)))
{
paths.Remove(balancePath);
paths.Add(new EventPath("Balance", Convert.ToDecimal(balancePath.Value), ValueType.Decimal));
paths.Add(new EventPath("Balance", Convert.ToDecimal(balancePath.Value), EventValueType.Decimal));
}
}

Expand Down
14 changes: 7 additions & 7 deletions EliteAPI/Json/JsonUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
using EliteAPI.Json.SerializationSettings;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ValueType = EliteAPI.Events.ValueType;
using EventValueType = EliteAPI.Events.EventValueType;

namespace EliteAPI.Json;

Expand Down Expand Up @@ -108,37 +108,37 @@ private static EventPath ToJsonPath(this JValue value)
{
Path = path,
Value = Convert.ToInt32(value.Value),
Type = ValueType.Number
Type = EventValueType.Number
},
JTokenType.Float => new EventPath
{
Path = path,
Value = value.Value is BigInteger bigInt ? (decimal)bigInt : Convert.ToDecimal(value.Value),
Type = ValueType.Decimal
Type = EventValueType.Decimal
},
JTokenType.Uri or JTokenType.Guid or JTokenType.String => new EventPath
{
Path = path,
Value = Convert.ToString(value.Value) ?? string.Empty,
Type = ValueType.String
Type = EventValueType.String
},
JTokenType.Boolean => new EventPath
{
Path = path,
Value = Convert.ToBoolean(value.Value),
Type = ValueType.Boolean
Type = EventValueType.Boolean
},
JTokenType.Date => new EventPath
{
Path = path,
Value = Convert.ToDateTime(value.Value),
Type = ValueType.DateTime
Type = EventValueType.DateTime
},
_ => new EventPath
{
Path = "",
Value = "",
Type = ValueType.String
Type = EventValueType.String
},
};
}
Expand Down
Loading
Loading