From 756e2e62f05835a44109b0ac570025b94f49f2c3 Mon Sep 17 00:00:00 2001 From: vjrj <vjrj@comunes.org> Date: Sun, 1 Dec 2024 20:06:34 +0100 Subject: [PATCH] Refactor sorting nodes by error or latency logic --- lib/data/models/node_manager.dart | 20 ++++++---- test/g1_test.dart | 62 +++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/lib/data/models/node_manager.dart b/lib/data/models/node_manager.dart index f7da065b..253fd0e2 100644 --- a/lib/data/models/node_manager.dart +++ b/lib/data/models/node_manager.dart @@ -196,14 +196,7 @@ class NodeManager { .where((Node node) => (maxCurrentBlock - node.currentBlock).abs() <= 2) .toList(); - nodesNearMaxBlock.sort((Node a, Node b) { - final int errorComparison = a.errors.compareTo(b.errors); - if (errorComparison != 0) { - return errorComparison; - } else { - return a.latency.compareTo(b.latency); - } - }); + sortNodesByErrorOrLatency(nodesNearMaxBlock); if (nodesNearMaxBlock.isEmpty) { nodesNearMaxBlock.addAll(defaultNodes(type)); @@ -249,3 +242,14 @@ class NodeManagerObserver { return cubit.currentGvaNode; } } + +void sortNodesByErrorOrLatency(List<Node> nodesNearMaxBlock) { + nodesNearMaxBlock.sort((Node a, Node b) { + final int errorComparison = a.errors.compareTo(b.errors); + if (errorComparison != 0) { + return errorComparison; + } else { + return a.latency.compareTo(b.latency); + } + }); +} diff --git a/test/g1_test.dart b/test/g1_test.dart index ef3ac000..252b86a1 100644 --- a/test/g1_test.dart +++ b/test/g1_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:ginkgo/data/models/contact.dart'; import 'package:ginkgo/data/models/node.dart'; import 'package:ginkgo/data/models/node_lists_default.dart'; +import 'package:ginkgo/data/models/node_manager.dart'; import 'package:ginkgo/data/models/payment_state.dart'; import 'package:ginkgo/data/models/transaction.dart'; import 'package:ginkgo/data/models/transaction_type.dart'; @@ -789,4 +790,65 @@ Data: 2RTjpjZMnFnKHhgUadgT7JUvGeQem5sC6DQQpeuo5dCL6V1fgqsg8 } } }); + + group('sortNodesByErrorOrLatency', () { + test('Sorts by errors first, then by latency', () { + final List<Node> nodes = <Node>[ + const Node(url: 'node1', latency: 100, errors: 3), + const Node(url: 'node2', latency: 50, errors: 1), + const Node(url: 'node3', latency: 75, errors: 1), + const Node(url: 'node4', latency: 30, errors: 2), + ]; + + sortNodesByErrorOrLatency(nodes); + + expect(nodes[0].url, 'node2'); // Lowest errors, lowest latency + expect(nodes[1].url, 'node3'); // Same errors, higher latency + expect(nodes[2].url, 'node4'); // Higher errors + expect(nodes[3].url, 'node1'); // Highest errors + }); + + test('Handles empty list', () { + final List<Node> nodes = <Node>[]; + sortNodesByErrorOrLatency(nodes); + expect(nodes, isEmpty); + }); + + test('Handles single node', () { + final List<Node> nodes = <Node>[const Node(url: 'node1', latency: 100)]; + sortNodesByErrorOrLatency(nodes); + expect(nodes.length, 1); + expect(nodes[0].url, 'node1'); + }); + + test('Handles all nodes with same errors and latency', () { + final List<Node> nodes = <Node>[ + const Node(url: 'node1', latency: 50, errors: 2), + const Node(url: 'node2', latency: 50, errors: 2), + const Node(url: 'node3', latency: 50, errors: 2), + ]; + + sortNodesByErrorOrLatency(nodes); + + expect(nodes[0].url, 'node1'); // Order remains as is + expect(nodes[1].url, 'node2'); + expect(nodes[2].url, 'node3'); + }); + + test('Sorts correctly with mixed errors and latencies', () { + final List<Node> nodes = <Node>[ + const Node(url: 'node1', latency: 70, errors: 2), + const Node(url: 'node2', latency: 60, errors: 2), + const Node(url: 'node3', latency: 80, errors: 1), + const Node(url: 'node4', latency: 50, errors: 1), + ]; + + sortNodesByErrorOrLatency(nodes); + + expect(nodes[0].url, 'node4'); // Fewest errors, lowest latency + expect(nodes[1].url, 'node3'); // Fewest errors, higher latency + expect(nodes[2].url, 'node2'); // More errors, lower latency + expect(nodes[3].url, 'node1'); // More errors, higher latency + }); + }); } -- GitLab