|  | 
| 1 | 1 | 
 | 
| 2 | 2 | import 'package:checks/checks.dart'; | 
|  | 3 | +import 'package:collection/collection.dart'; | 
| 3 | 4 | import 'package:test/scaffolding.dart'; | 
| 4 | 5 | import 'package:zulip/api/model/events.dart'; | 
| 5 | 6 | import 'package:zulip/api/model/initial_snapshot.dart'; | 
| 6 | 7 | import 'package:zulip/api/model/model.dart'; | 
|  | 8 | +import 'package:zulip/model/algorithms.dart'; | 
| 7 | 9 | import 'package:zulip/model/store.dart'; | 
| 8 | 10 | import 'package:zulip/model/channel.dart'; | 
| 9 | 11 | 
 | 
| @@ -394,4 +396,118 @@ void main() { | 
| 394 | 396 |         .equals(UserTopicVisibilityPolicy.none); | 
| 395 | 397 |     }); | 
| 396 | 398 |   }); | 
|  | 399 | +    group('TopicMap with QueueList<int>', () { | 
|  | 400 | +    test('initially empty', () { | 
|  | 401 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 402 | +      check(topicMap.size).equals(0); | 
|  | 403 | +      check(topicMap.keys()).isEmpty(); | 
|  | 404 | +      check(topicMap.values()).isEmpty(); | 
|  | 405 | +      check(topicMap.entries).isEmpty(); | 
|  | 406 | +      check(topicMap.toMap()).deepEquals({}); | 
|  | 407 | +    }); | 
|  | 408 | + | 
|  | 409 | +    test('set and get values', () { | 
|  | 410 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 411 | +      final topic = TopicName('Topic1'); | 
|  | 412 | +      final value = QueueList<int>(); | 
|  | 413 | +      value.addAll([1, 2, 3]); | 
|  | 414 | +      topicMap.set(topic, value); | 
|  | 415 | + | 
|  | 416 | +      check(topicMap.size).equals(1); | 
|  | 417 | +      check(topicMap.get(topic)).equals(value); | 
|  | 418 | +    }); | 
|  | 419 | + | 
|  | 420 | +    test('containsKey and remove', () { | 
|  | 421 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 422 | +      final topic = TopicName('Math'); | 
|  | 423 | +      final value = QueueList<int>(); | 
|  | 424 | +      value.addAll([3, 1, 4]); | 
|  | 425 | +      topicMap.set(topic, value); | 
|  | 426 | + | 
|  | 427 | +      check(topicMap.containsKey(topic)).isTrue(); | 
|  | 428 | +      // Removing should return true. | 
|  | 429 | +      check(topicMap.remove(topic)).isTrue(); | 
|  | 430 | +      check(topicMap.containsKey(topic)).isFalse(); | 
|  | 431 | +      check(topicMap.size).equals(0); | 
|  | 432 | +      // Removing a non-existent key returns false. | 
|  | 433 | +      check(topicMap.remove(topic)).isFalse(); | 
|  | 434 | +    }); | 
|  | 435 | + | 
|  | 436 | +    test('keys, values, and entries', () { | 
|  | 437 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 438 | +      final topicA = TopicName('A'); | 
|  | 439 | +      final topicB = TopicName('B'); | 
|  | 440 | +      final valueA = QueueList<int>(); | 
|  | 441 | +      valueA.addAll([10, 20]); | 
|  | 442 | +      final valueB = QueueList<int>(); | 
|  | 443 | +      valueB.addAll([30,40]); | 
|  | 444 | +      topicMap.set(topicA, valueA); | 
|  | 445 | +      topicMap.set(topicB, valueB); | 
|  | 446 | + | 
|  | 447 | +      final keys = topicMap.keys().toList(); | 
|  | 448 | +      check(keys.length).equals(2); | 
|  | 449 | +      check(keys).contains(topicA); | 
|  | 450 | +      check(keys).contains(topicB); | 
|  | 451 | + | 
|  | 452 | +      final values = topicMap.values().toList(); | 
|  | 453 | +      check(values.length).equals(2); | 
|  | 454 | +      check(values).contains(valueA); | 
|  | 455 | +      check(values).contains(valueB); | 
|  | 456 | + | 
|  | 457 | +      final entries = topicMap.entries.toList(); | 
|  | 458 | +      check(entries.length).equals(2); | 
|  | 459 | +      for (final entry in entries) { | 
|  | 460 | +        if (entry.key == topicA) { | 
|  | 461 | +          check(entry.value).equals(valueA); | 
|  | 462 | +        } else if (entry.key == topicB) { | 
|  | 463 | +          check(entry.value).equals(valueB); | 
|  | 464 | +        } | 
|  | 465 | +      } | 
|  | 466 | +    }); | 
|  | 467 | + | 
|  | 468 | +    test('clear and toMap', () { | 
|  | 469 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 470 | +      final topic1 = TopicName('One'); | 
|  | 471 | +      final topic2 = TopicName('Two'); | 
|  | 472 | +      final value1 = QueueList<int>(); | 
|  | 473 | +      final value2 = QueueList<int>(); | 
|  | 474 | +      value1.add(1); | 
|  | 475 | +      value2.add(2); | 
|  | 476 | +      topicMap.set(topic1, value1); | 
|  | 477 | +      topicMap.set(topic2, value2); | 
|  | 478 | + | 
|  | 479 | +      check(topicMap.size).equals(2); | 
|  | 480 | +      check(topicMap.toMap()).deepEquals({ | 
|  | 481 | +        topic1: value1, | 
|  | 482 | +        topic2: value2, | 
|  | 483 | +      }); | 
|  | 484 | + | 
|  | 485 | +      topicMap.clear(); | 
|  | 486 | +      check(topicMap.size).equals(0); | 
|  | 487 | +      check(topicMap.toMap()).deepEquals({}); | 
|  | 488 | +    }); | 
|  | 489 | + | 
|  | 490 | +    test('key normalization is case-insensitive', () { | 
|  | 491 | +      final topicMap = TopicMap<QueueList<int>>(); | 
|  | 492 | +      // Using two TopicName instances that differ only by case. | 
|  | 493 | +      final topicUpper = TopicName('HELLO'); | 
|  | 494 | +      final topicLower = TopicName('hello'); | 
|  | 495 | +      final valueLower = QueueList<int>(); | 
|  | 496 | +      final valueUpper = QueueList<int>(); | 
|  | 497 | +      valueUpper.add(42); | 
|  | 498 | +      valueLower.add(32); | 
|  | 499 | +      topicMap.set(topicLower, valueLower); | 
|  | 500 | +      topicMap.set(topicUpper, setUnion(topicMap.get(topicLower) as Iterable<int>, valueUpper)); | 
|  | 501 | +      // Since _munge lowercases the key, using a different case should return the same value. | 
|  | 502 | +      final list1 = topicMap.get(topicUpper); | 
|  | 503 | +      final list2 = setUnion(valueUpper, valueLower); | 
|  | 504 | +      check(list1?.length).equals(list2.length); | 
|  | 505 | +      for ( int i = 0; i < list1!.length; i++ ) { | 
|  | 506 | +        check(list1[i]).equals(list2[i]); | 
|  | 507 | +      } | 
|  | 508 | + | 
|  | 509 | +      check(topicMap.toMap().containsKey(TopicName("HELLO"))).isTrue(); | 
|  | 510 | +      check(topicMap.toMap().containsKey(TopicName("hello"))).isFalse(); | 
|  | 511 | +    }); | 
|  | 512 | +  }); | 
| 397 | 513 | } | 
0 commit comments