From 63879151b0956707ef4071346f5e5c94682005b9 Mon Sep 17 00:00:00 2001 From: Konstantin Ivaschenko Date: Wed, 16 Oct 2024 18:08:38 +0300 Subject: [PATCH] [MDAPI-165] [.NET] DxFeed.Graal.Net.Schedules.GetNextSession does not return null if no session exists --- ReleaseNotes.txt | 2 + src/DxFeed.Graal.Net/DxFeed.Graal.Net.csproj | 2 +- src/DxFeed.Graal.Net/Schedules/Day.cs | 18 +++--- src/DxFeed.Graal.Net/Schedules/Schedule.cs | 6 +- src/DxFeed.Graal.Net/Schedules/Session.cs | 8 +-- .../Schedules/ScheduleTest.cs | 56 +++++++++++++++++++ 6 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 tests/DxFeed.Graal.Net.Tests/Schedules/ScheduleTest.cs diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index b6cdedb0..f7102abc 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,3 +1,5 @@ +* [MDAPI-165] [.NET] DxFeed.Graal.Net.Schedules.GetNextSession does not return null if no session exists + ## Version 2.5.1 * [MDAPI-124] [.NET] Remove the ability to pass multiple sources for PriceLeveBookSample diff --git a/src/DxFeed.Graal.Net/DxFeed.Graal.Net.csproj b/src/DxFeed.Graal.Net/DxFeed.Graal.Net.csproj index f914f7a2..291a91cb 100644 --- a/src/DxFeed.Graal.Net/DxFeed.Graal.Net.csproj +++ b/src/DxFeed.Graal.Net/DxFeed.Graal.Net.csproj @@ -21,7 +21,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/DxFeed.Graal.Net/Schedules/Day.cs b/src/DxFeed.Graal.Net/Schedules/Day.cs index d962da00..7fb9436b 100644 --- a/src/DxFeed.Graal.Net/Schedules/Day.cs +++ b/src/DxFeed.Graal.Net/Schedules/Day.cs @@ -178,8 +178,8 @@ public Session GetSessionByTime(long time) => public bool TryGetFirstSession(SessionFilter filter, out Session session) { session = null!; - var first = this.handle.FindFirstSession(filter.Handle); - if (first == null) + var first = handle.FindFirstSession(filter.Handle); + if (first == null || first.IsInvalid) { return false; } @@ -216,13 +216,13 @@ public bool TryGetFirstSession(SessionFilter filter, out Session session) public bool TryGetLastSession(SessionFilter filter, out Session session) { session = null!; - var first = this.handle.FindLastSession(filter.Handle); - if (first == null) + var last = handle.FindLastSession(filter.Handle); + if (last == null || last.IsInvalid) { return false; } - session = new Session(Schedule, first); + session = new Session(Schedule, last); return true; } @@ -248,8 +248,8 @@ public bool TryGetLastSession(SessionFilter filter, out Session session) public bool TryGetPrevDay(DayFilter filter, out Day day) { day = null!; - var prev = this.handle.FindPrevDay(filter.Handle); - if (prev == null) + var prev = handle.FindPrevDay(filter.Handle); + if (prev == null || prev.IsInvalid) { return false; } @@ -284,8 +284,8 @@ public bool TryGetPrevDay(DayFilter filter, out Day day) public bool TryGetNextDay(DayFilter filter, out Day day) { day = null!; - var next = this.handle.FindNextDay(filter.Handle); - if (next == null) + var next = handle.FindNextDay(filter.Handle); + if (next == null || next.IsInvalid) { return false; } diff --git a/src/DxFeed.Graal.Net/Schedules/Schedule.cs b/src/DxFeed.Graal.Net/Schedules/Schedule.cs index 565bc06b..62d49301 100644 --- a/src/DxFeed.Graal.Net/Schedules/Schedule.cs +++ b/src/DxFeed.Graal.Net/Schedules/Schedule.cs @@ -147,13 +147,13 @@ public Day GetDayByYearMonthDay(int yearMonthDay) => public bool TryGetNearestSessionByTime(long time, SessionFilter filter, out Session session) { session = null!; - var prev = handle.FindNearestSessionByTime(time, filter.Handle); - if (prev == null) + var nearest = handle.FindNearestSessionByTime(time, filter.Handle); + if (nearest == null || nearest.IsInvalid) { return false; } - session = new Session(this, prev); + session = new Session(this, nearest); return true; } diff --git a/src/DxFeed.Graal.Net/Schedules/Session.cs b/src/DxFeed.Graal.Net/Schedules/Session.cs index a4a72399..94e0f9a3 100644 --- a/src/DxFeed.Graal.Net/Schedules/Session.cs +++ b/src/DxFeed.Graal.Net/Schedules/Session.cs @@ -105,7 +105,7 @@ public bool TryGetPrevSession(SessionFilter filter, out Session session) { session = null!; var prev = handle.FindPrevSession(filter.Handle); - if (prev == null) + if (prev == null || prev.IsInvalid) { return false; } @@ -144,13 +144,13 @@ public bool TryGetPrevSession(SessionFilter filter, out Session session) public bool TryGetNextSession(SessionFilter filter, out Session session) { session = null!; - var prev = handle.FindNextSession(filter.Handle); - if (prev == null) + var next = handle.FindNextSession(filter.Handle); + if (next == null || next.IsInvalid) { return false; } - session = new Session(schedule, prev); + session = new Session(schedule, next); return true; } diff --git a/tests/DxFeed.Graal.Net.Tests/Schedules/ScheduleTest.cs b/tests/DxFeed.Graal.Net.Tests/Schedules/ScheduleTest.cs new file mode 100644 index 00000000..4c730afe --- /dev/null +++ b/tests/DxFeed.Graal.Net.Tests/Schedules/ScheduleTest.cs @@ -0,0 +1,56 @@ +// +// Copyright © 2024 Devexperts LLC. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// + +using DxFeed.Graal.Net.Ipf; +using DxFeed.Graal.Net.Schedules; + +namespace DxFeed.Graal.Net.Tests.Schedules; + +[TestFixture] +public class ScheduleTest +{ + private static readonly string TestIpf = Path.Combine(TestContext.CurrentContext.TestDirectory, "ipf.txt"); + + [Test] + public void Day_ShouldReturnsNullValueForInvalidSession() + { + var profiles = new InstrumentProfileReader().ReadFromFile(TestIpf); + foreach (var profile in profiles) { + var schedule = Schedule.GetInstance(profile); + var day = schedule.GetDayByYearMonthDay(01012024); + var session = day.GetFirstSession(SessionFilter.AFTER_MARKET); + Assert.That(session, Is.Null); + session = day.GetLastSession(SessionFilter.AFTER_MARKET); + Assert.That(session, Is.Null); + Assert.Multiple(() => + { + Assert.That(day.TryGetFirstSession(SessionFilter.AFTER_MARKET, out session), Is.False); + Assert.That(session, Is.Null); + Assert.That(day.TryGetLastSession(SessionFilter.AFTER_MARKET, out session), Is.False); + Assert.That(session, Is.Null); + }); + } + } + + [Test] + public void Day_ShouldReturnsNullValueForInvalidDay() + { + var profiles = new InstrumentProfileReader().ReadFromFile(TestIpf); + foreach (var profile in profiles) { + var schedule = Schedule.GetInstance(profile); + var day = schedule.GetDayByYearMonthDay(01011950); + Assert.Multiple(() => + { + Assert.That(day.GetNextDay(DayFilter.SHORT_DAY), Is.Null); + Assert.That(day.GetPrevDay(DayFilter.SHORT_DAY), Is.Null); + Assert.That(day.TryGetNextDay(DayFilter.SHORT_DAY, out var nextDay), Is.False); + Assert.That(nextDay, Is.Null); + Assert.That(day.TryGetPrevDay(DayFilter.SHORT_DAY, out var prevDay), Is.False); + Assert.That(prevDay, Is.Null); + }); + } + } +}