summaryrefslogtreecommitdiff
path: root/vendor/indexmap/tests
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-15 16:37:08 -0600
committermo khan <mo@mokhan.ca>2025-07-17 16:30:22 -0600
commit45df4d0d9b577fecee798d672695fe24ff57fb1b (patch)
tree1b99bf645035b58e0d6db08c7a83521f41f7a75b /vendor/indexmap/tests
parentf94f79608393d4ab127db63cc41668445ef6b243 (diff)
feat: migrate from Cedar to SpiceDB authorization system
This is a major architectural change that replaces the Cedar policy-based authorization system with SpiceDB's relation-based authorization. Key changes: - Migrate from Rust to Go implementation - Replace Cedar policies with SpiceDB schema and relationships - Switch from envoy `ext_authz` with Cedar to SpiceDB permission checks - Update build system and dependencies for Go ecosystem - Maintain Envoy integration for external authorization This change enables more flexible permission modeling through SpiceDB's Google Zanzibar inspired relation-based system, supporting complex hierarchical permissions that were difficult to express in Cedar. Breaking change: Existing Cedar policies and Rust-based configuration will no longer work and need to be migrated to SpiceDB schema.
Diffstat (limited to 'vendor/indexmap/tests')
-rw-r--r--vendor/indexmap/tests/equivalent_trait.rs53
-rw-r--r--vendor/indexmap/tests/macros_full_path.rs19
-rw-r--r--vendor/indexmap/tests/quick.rs759
-rw-r--r--vendor/indexmap/tests/tests.rs28
4 files changed, 0 insertions, 859 deletions
diff --git a/vendor/indexmap/tests/equivalent_trait.rs b/vendor/indexmap/tests/equivalent_trait.rs
deleted file mode 100644
index ff5943a3..00000000
--- a/vendor/indexmap/tests/equivalent_trait.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-use indexmap::indexmap;
-use indexmap::Equivalent;
-
-use std::hash::Hash;
-
-#[derive(Debug, Hash)]
-pub struct Pair<A, B>(pub A, pub B);
-
-impl<A, B, C, D> PartialEq<(A, B)> for Pair<C, D>
-where
- C: PartialEq<A>,
- D: PartialEq<B>,
-{
- fn eq(&self, rhs: &(A, B)) -> bool {
- self.0 == rhs.0 && self.1 == rhs.1
- }
-}
-
-impl<A, B, X> Equivalent<X> for Pair<A, B>
-where
- Pair<A, B>: PartialEq<X>,
- A: Hash + Eq,
- B: Hash + Eq,
-{
- fn equivalent(&self, other: &X) -> bool {
- *self == *other
- }
-}
-
-#[test]
-fn test_lookup() {
- let s = String::from;
- let map = indexmap! {
- (s("a"), s("b")) => 1,
- (s("a"), s("x")) => 2,
- };
-
- assert!(map.contains_key(&Pair("a", "b")));
- assert!(!map.contains_key(&Pair("b", "a")));
-}
-
-#[test]
-fn test_string_str() {
- let s = String::from;
- let mut map = indexmap! {
- s("a") => 1, s("b") => 2,
- s("x") => 3, s("y") => 4,
- };
-
- assert!(map.contains_key("a"));
- assert!(!map.contains_key("z"));
- assert_eq!(map.swap_remove("b"), Some(2));
-}
diff --git a/vendor/indexmap/tests/macros_full_path.rs b/vendor/indexmap/tests/macros_full_path.rs
deleted file mode 100644
index 2467d9b4..00000000
--- a/vendor/indexmap/tests/macros_full_path.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-#[test]
-fn test_create_map() {
- let _m = indexmap::indexmap! {
- 1 => 2,
- 7 => 1,
- 2 => 2,
- 3 => 3,
- };
-}
-
-#[test]
-fn test_create_set() {
- let _s = indexmap::indexset! {
- 1,
- 7,
- 2,
- 3,
- };
-}
diff --git a/vendor/indexmap/tests/quick.rs b/vendor/indexmap/tests/quick.rs
deleted file mode 100644
index 56afee72..00000000
--- a/vendor/indexmap/tests/quick.rs
+++ /dev/null
@@ -1,759 +0,0 @@
-use indexmap::{IndexMap, IndexSet};
-use itertools::Itertools;
-
-use quickcheck::Arbitrary;
-use quickcheck::Gen;
-use quickcheck::QuickCheck;
-use quickcheck::TestResult;
-
-use fnv::FnvHasher;
-use std::hash::{BuildHasher, BuildHasherDefault};
-type FnvBuilder = BuildHasherDefault<FnvHasher>;
-type IndexMapFnv<K, V> = IndexMap<K, V, FnvBuilder>;
-
-use std::cmp::min;
-use std::collections::HashMap;
-use std::collections::HashSet;
-use std::fmt::Debug;
-use std::hash::Hash;
-use std::ops::Bound;
-use std::ops::Deref;
-
-use indexmap::map::Entry;
-use std::collections::hash_map::Entry as StdEntry;
-
-fn set<'a, T: 'a, I>(iter: I) -> HashSet<T>
-where
- I: IntoIterator<Item = &'a T>,
- T: Copy + Hash + Eq,
-{
- iter.into_iter().copied().collect()
-}
-
-fn indexmap<'a, T: 'a, I>(iter: I) -> IndexMap<T, ()>
-where
- I: IntoIterator<Item = &'a T>,
- T: Copy + Hash + Eq,
-{
- IndexMap::from_iter(iter.into_iter().copied().map(|k| (k, ())))
-}
-
-// Helper macro to allow us to use smaller quickcheck limits under miri.
-macro_rules! quickcheck_limit {
- (@as_items $($i:item)*) => ($($i)*);
- {
- $(
- $(#[$m:meta])*
- fn $fn_name:ident($($arg_name:ident : $arg_ty:ty),*) -> $ret:ty {
- $($code:tt)*
- }
- )*
- } => (
- quickcheck::quickcheck! {
- @as_items
- $(
- #[test]
- $(#[$m])*
- fn $fn_name() {
- fn prop($($arg_name: $arg_ty),*) -> $ret {
- $($code)*
- }
- let mut quickcheck = QuickCheck::new();
- if cfg!(miri) {
- quickcheck = quickcheck
- .gen(Gen::new(10))
- .tests(10)
- .max_tests(100);
- }
-
- quickcheck.quickcheck(prop as fn($($arg_ty),*) -> $ret);
- }
- )*
- }
- )
-}
-
-quickcheck_limit! {
- fn contains(insert: Vec<u32>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- insert.iter().all(|&key| map.get(&key).is_some())
- }
-
- fn contains_not(insert: Vec<u8>, not: Vec<u8>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- let nots = &set(&not) - &set(&insert);
- nots.iter().all(|&key| map.get(&key).is_none())
- }
-
- fn insert_remove(insert: Vec<u8>, remove: Vec<u8>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- for &key in &remove {
- map.swap_remove(&key);
- }
- let elements = &set(&insert) - &set(&remove);
- map.len() == elements.len() && map.iter().count() == elements.len() &&
- elements.iter().all(|k| map.get(k).is_some())
- }
-
- fn insertion_order(insert: Vec<u32>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- itertools::assert_equal(insert.iter().unique(), map.keys());
- true
- }
-
- fn insert_sorted(insert: Vec<(u32, u32)>) -> bool {
- let mut hmap = HashMap::new();
- let mut map = IndexMap::new();
- let mut map2 = IndexMap::new();
- for &(key, value) in &insert {
- hmap.insert(key, value);
- map.insert_sorted(key, value);
- match map2.entry(key) {
- Entry::Occupied(e) => *e.into_mut() = value,
- Entry::Vacant(e) => { e.insert_sorted(value); }
- }
- }
- itertools::assert_equal(hmap.iter().sorted(), &map);
- itertools::assert_equal(&map, &map2);
- true
- }
-
- fn pop(insert: Vec<u8>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- let mut pops = Vec::new();
- while let Some((key, _v)) = map.pop() {
- pops.push(key);
- }
- pops.reverse();
-
- itertools::assert_equal(insert.iter().unique(), &pops);
- true
- }
-
- fn with_cap(template: Vec<()>) -> bool {
- let cap = template.len();
- let map: IndexMap<u8, u8> = IndexMap::with_capacity(cap);
- println!("wish: {}, got: {} (diff: {})", cap, map.capacity(), map.capacity() as isize - cap as isize);
- map.capacity() >= cap
- }
-
- fn drain_full(insert: Vec<u8>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- let mut clone = map.clone();
- let drained = clone.drain(..);
- for (key, _) in drained {
- map.swap_remove(&key);
- }
- map.is_empty()
- }
-
- fn drain_bounds(insert: Vec<u8>, range: (Bound<usize>, Bound<usize>)) -> TestResult {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
-
- // First see if `Vec::drain` is happy with this range.
- let result = std::panic::catch_unwind(|| {
- let mut keys: Vec<u8> = map.keys().copied().collect();
- keys.drain(range);
- keys
- });
-
- if let Ok(keys) = result {
- map.drain(range);
- // Check that our `drain` matches the same key order.
- assert!(map.keys().eq(&keys));
- // Check that hash lookups all work too.
- assert!(keys.iter().all(|key| map.contains_key(key)));
- TestResult::passed()
- } else {
- // If `Vec::drain` panicked, so should we.
- TestResult::must_fail(move || { map.drain(range); })
- }
- }
-
- fn shift_remove(insert: Vec<u8>, remove: Vec<u8>) -> bool {
- let mut map = IndexMap::new();
- for &key in &insert {
- map.insert(key, ());
- }
- for &key in &remove {
- map.shift_remove(&key);
- }
- let elements = &set(&insert) - &set(&remove);
-
- // Check that order is preserved after removals
- let mut iter = map.keys();
- for &key in insert.iter().unique() {
- if elements.contains(&key) {
- assert_eq!(Some(&key), iter.next());
- }
- }
-
- map.len() == elements.len() && map.iter().count() == elements.len() &&
- elements.iter().all(|k| map.get(k).is_some())
- }
-
- fn indexing(insert: Vec<u8>) -> bool {
- let mut map: IndexMap<_, _> = insert.into_iter().map(|x| (x, x)).collect();
- let set: IndexSet<_> = map.keys().copied().collect();
- assert_eq!(map.len(), set.len());
-
- for (i, &key) in set.iter().enumerate() {
- assert_eq!(map.get_index(i), Some((&key, &key)));
- assert_eq!(set.get_index(i), Some(&key));
- assert_eq!(map[i], key);
- assert_eq!(set[i], key);
-
- *map.get_index_mut(i).unwrap().1 >>= 1;
- map[i] <<= 1;
- }
-
- set.iter().enumerate().all(|(i, &key)| {
- let value = key & !1;
- map[&key] == value && map[i] == value
- })
- }
-
- // Use `u8` test indices so quickcheck is less likely to go out of bounds.
- fn set_swap_indices(vec: Vec<u8>, a: u8, b: u8) -> TestResult {
- let mut set = IndexSet::<u8>::from_iter(vec);
- let a = usize::from(a);
- let b = usize::from(b);
-
- if a >= set.len() || b >= set.len() {
- return TestResult::discard();
- }
-
- let mut vec = Vec::from_iter(set.iter().cloned());
- vec.swap(a, b);
-
- set.swap_indices(a, b);
-
- // Check both iteration order and hash lookups
- assert!(set.iter().eq(vec.iter()));
- assert!(vec.iter().enumerate().all(|(i, x)| {
- set.get_index_of(x) == Some(i)
- }));
- TestResult::passed()
- }
-
- fn map_swap_indices(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_swap_indices(vec, from, to, IndexMap::swap_indices)
- }
-
- fn occupied_entry_swap_indices(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_swap_indices(vec, from, to, |map, from, to| {
- let key = map.keys()[from];
- match map.entry(key) {
- Entry::Occupied(entry) => entry.swap_indices(to),
- _ => unreachable!(),
- }
- })
- }
-
- fn indexed_entry_swap_indices(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_swap_indices(vec, from, to, |map, from, to| {
- map.get_index_entry(from).unwrap().swap_indices(to);
- })
- }
-
- fn raw_occupied_entry_swap_indices(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- use indexmap::map::raw_entry_v1::{RawEntryApiV1, RawEntryMut};
- test_map_swap_indices(vec, from, to, |map, from, to| {
- let key = map.keys()[from];
- match map.raw_entry_mut_v1().from_key(&key) {
- RawEntryMut::Occupied(entry) => entry.swap_indices(to),
- _ => unreachable!(),
- }
- })
- }
-
- // Use `u8` test indices so quickcheck is less likely to go out of bounds.
- fn set_move_index(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- let mut set = IndexSet::<u8>::from_iter(vec);
- let from = usize::from(from);
- let to = usize::from(to);
-
- if from >= set.len() || to >= set.len() {
- return TestResult::discard();
- }
-
- let mut vec = Vec::from_iter(set.iter().cloned());
- let x = vec.remove(from);
- vec.insert(to, x);
-
- set.move_index(from, to);
-
- // Check both iteration order and hash lookups
- assert!(set.iter().eq(vec.iter()));
- assert!(vec.iter().enumerate().all(|(i, x)| {
- set.get_index_of(x) == Some(i)
- }));
- TestResult::passed()
- }
-
- fn map_move_index(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_move_index(vec, from, to, IndexMap::move_index)
- }
-
- fn occupied_entry_move_index(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_move_index(vec, from, to, |map, from, to| {
- let key = map.keys()[from];
- match map.entry(key) {
- Entry::Occupied(entry) => entry.move_index(to),
- _ => unreachable!(),
- }
- })
- }
-
- fn indexed_entry_move_index(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- test_map_move_index(vec, from, to, |map, from, to| {
- map.get_index_entry(from).unwrap().move_index(to);
- })
- }
-
- fn raw_occupied_entry_move_index(vec: Vec<u8>, from: u8, to: u8) -> TestResult {
- use indexmap::map::raw_entry_v1::{RawEntryApiV1, RawEntryMut};
- test_map_move_index(vec, from, to, |map, from, to| {
- let key = map.keys()[from];
- match map.raw_entry_mut_v1().from_key(&key) {
- RawEntryMut::Occupied(entry) => entry.move_index(to),
- _ => unreachable!(),
- }
- })
- }
-
- fn occupied_entry_shift_insert(vec: Vec<u8>, i: u8) -> TestResult {
- test_map_shift_insert(vec, i, |map, i, key| {
- match map.entry(key) {
- Entry::Vacant(entry) => entry.shift_insert(i, ()),
- _ => unreachable!(),
- };
- })
- }
-
- fn raw_occupied_entry_shift_insert(vec: Vec<u8>, i: u8) -> TestResult {
- use indexmap::map::raw_entry_v1::{RawEntryApiV1, RawEntryMut};
- test_map_shift_insert(vec, i, |map, i, key| {
- match map.raw_entry_mut_v1().from_key(&key) {
- RawEntryMut::Vacant(entry) => entry.shift_insert(i, key, ()),
- _ => unreachable!(),
- };
- })
- }
-}
-
-fn test_map_swap_indices<F>(vec: Vec<u8>, a: u8, b: u8, swap_indices: F) -> TestResult
-where
- F: FnOnce(&mut IndexMap<u8, ()>, usize, usize),
-{
- let mut map = IndexMap::<u8, ()>::from_iter(vec.into_iter().map(|k| (k, ())));
- let a = usize::from(a);
- let b = usize::from(b);
-
- if a >= map.len() || b >= map.len() {
- return TestResult::discard();
- }
-
- let mut vec = Vec::from_iter(map.keys().copied());
- vec.swap(a, b);
-
- swap_indices(&mut map, a, b);
-
- // Check both iteration order and hash lookups
- assert!(map.keys().eq(vec.iter()));
- assert!(vec
- .iter()
- .enumerate()
- .all(|(i, x)| { map.get_index_of(x) == Some(i) }));
- TestResult::passed()
-}
-
-fn test_map_move_index<F>(vec: Vec<u8>, from: u8, to: u8, move_index: F) -> TestResult
-where
- F: FnOnce(&mut IndexMap<u8, ()>, usize, usize),
-{
- let mut map = IndexMap::<u8, ()>::from_iter(vec.into_iter().map(|k| (k, ())));
- let from = usize::from(from);
- let to = usize::from(to);
-
- if from >= map.len() || to >= map.len() {
- return TestResult::discard();
- }
-
- let mut vec = Vec::from_iter(map.keys().copied());
- let x = vec.remove(from);
- vec.insert(to, x);
-
- move_index(&mut map, from, to);
-
- // Check both iteration order and hash lookups
- assert!(map.keys().eq(vec.iter()));
- assert!(vec
- .iter()
- .enumerate()
- .all(|(i, x)| { map.get_index_of(x) == Some(i) }));
- TestResult::passed()
-}
-
-fn test_map_shift_insert<F>(vec: Vec<u8>, i: u8, shift_insert: F) -> TestResult
-where
- F: FnOnce(&mut IndexMap<u8, ()>, usize, u8),
-{
- let mut map = IndexMap::<u8, ()>::from_iter(vec.into_iter().map(|k| (k, ())));
- let i = usize::from(i);
- if i >= map.len() {
- return TestResult::discard();
- }
-
- let mut vec = Vec::from_iter(map.keys().copied());
- let x = vec.pop().unwrap();
- vec.insert(i, x);
-
- let (last, ()) = map.pop().unwrap();
- assert_eq!(x, last);
- map.shrink_to_fit(); // so we might have to grow and rehash the table
-
- shift_insert(&mut map, i, last);
-
- // Check both iteration order and hash lookups
- assert!(map.keys().eq(vec.iter()));
- assert!(vec
- .iter()
- .enumerate()
- .all(|(i, x)| { map.get_index_of(x) == Some(i) }));
- TestResult::passed()
-}
-
-use crate::Op::*;
-#[derive(Copy, Clone, Debug)]
-enum Op<K, V> {
- Add(K, V),
- Remove(K),
- AddEntry(K, V),
- RemoveEntry(K),
-}
-
-impl<K, V> Arbitrary for Op<K, V>
-where
- K: Arbitrary,
- V: Arbitrary,
-{
- fn arbitrary(g: &mut Gen) -> Self {
- match u32::arbitrary(g) % 4 {
- 0 => Add(K::arbitrary(g), V::arbitrary(g)),
- 1 => AddEntry(K::arbitrary(g), V::arbitrary(g)),
- 2 => Remove(K::arbitrary(g)),
- _ => RemoveEntry(K::arbitrary(g)),
- }
- }
-}
-
-fn do_ops<K, V, S>(ops: &[Op<K, V>], a: &mut IndexMap<K, V, S>, b: &mut HashMap<K, V>)
-where
- K: Hash + Eq + Clone,
- V: Clone,
- S: BuildHasher,
-{
- for op in ops {
- match *op {
- Add(ref k, ref v) => {
- a.insert(k.clone(), v.clone());
- b.insert(k.clone(), v.clone());
- }
- AddEntry(ref k, ref v) => {
- a.entry(k.clone()).or_insert_with(|| v.clone());
- b.entry(k.clone()).or_insert_with(|| v.clone());
- }
- Remove(ref k) => {
- a.swap_remove(k);
- b.remove(k);
- }
- RemoveEntry(ref k) => {
- if let Entry::Occupied(ent) = a.entry(k.clone()) {
- ent.swap_remove_entry();
- }
- if let StdEntry::Occupied(ent) = b.entry(k.clone()) {
- ent.remove_entry();
- }
- }
- }
- //println!("{:?}", a);
- }
-}
-
-fn assert_maps_equivalent<K, V>(a: &IndexMap<K, V>, b: &HashMap<K, V>) -> bool
-where
- K: Hash + Eq + Debug,
- V: Eq + Debug,
-{
- assert_eq!(a.len(), b.len());
- assert_eq!(a.iter().next().is_some(), b.iter().next().is_some());
- for key in a.keys() {
- assert!(b.contains_key(key), "b does not contain {:?}", key);
- }
- for key in b.keys() {
- assert!(a.get(key).is_some(), "a does not contain {:?}", key);
- }
- for key in a.keys() {
- assert_eq!(a[key], b[key]);
- }
- true
-}
-
-quickcheck_limit! {
- fn operations_i8(ops: Large<Vec<Op<i8, i8>>>) -> bool {
- let mut map = IndexMap::new();
- let mut reference = HashMap::new();
- do_ops(&ops, &mut map, &mut reference);
- assert_maps_equivalent(&map, &reference)
- }
-
- fn operations_string(ops: Vec<Op<Alpha, i8>>) -> bool {
- let mut map = IndexMap::new();
- let mut reference = HashMap::new();
- do_ops(&ops, &mut map, &mut reference);
- assert_maps_equivalent(&map, &reference)
- }
-
- fn keys_values(ops: Large<Vec<Op<i8, i8>>>) -> bool {
- let mut map = IndexMap::new();
- let mut reference = HashMap::new();
- do_ops(&ops, &mut map, &mut reference);
- let mut visit = IndexMap::new();
- for (k, v) in map.keys().zip(map.values()) {
- assert_eq!(&map[k], v);
- assert!(!visit.contains_key(k));
- visit.insert(*k, *v);
- }
- assert_eq!(visit.len(), reference.len());
- true
- }
-
- fn keys_values_mut(ops: Large<Vec<Op<i8, i8>>>) -> bool {
- let mut map = IndexMap::new();
- let mut reference = HashMap::new();
- do_ops(&ops, &mut map, &mut reference);
- let mut visit = IndexMap::new();
- let keys = Vec::from_iter(map.keys().copied());
- for (k, v) in keys.iter().zip(map.values_mut()) {
- assert_eq!(&reference[k], v);
- assert!(!visit.contains_key(k));
- visit.insert(*k, *v);
- }
- assert_eq!(visit.len(), reference.len());
- true
- }
-
- fn equality(ops1: Vec<Op<i8, i8>>, removes: Vec<usize>) -> bool {
- let mut map = IndexMap::new();
- let mut reference = HashMap::new();
- do_ops(&ops1, &mut map, &mut reference);
- let mut ops2 = ops1.clone();
- for &r in &removes {
- if !ops2.is_empty() {
- let i = r % ops2.len();
- ops2.remove(i);
- }
- }
- let mut map2 = IndexMapFnv::default();
- let mut reference2 = HashMap::new();
- do_ops(&ops2, &mut map2, &mut reference2);
- assert_eq!(map == map2, reference == reference2);
- true
- }
-
- fn retain_ordered(keys: Large<Vec<i8>>, remove: Large<Vec<i8>>) -> () {
- let mut map = indexmap(keys.iter());
- let initial_map = map.clone(); // deduplicated in-order input
- let remove_map = indexmap(remove.iter());
- let keys_s = set(keys.iter());
- let remove_s = set(remove.iter());
- let answer = &keys_s - &remove_s;
- map.retain(|k, _| !remove_map.contains_key(k));
-
- // check the values
- assert_eq!(map.len(), answer.len());
- for key in &answer {
- assert!(map.contains_key(key));
- }
- // check the order
- itertools::assert_equal(map.keys(), initial_map.keys().filter(|&k| !remove_map.contains_key(k)));
- }
-
- fn sort_1(keyvals: Large<Vec<(i8, i8)>>) -> () {
- let mut map: IndexMap<_, _> = IndexMap::from_iter(keyvals.to_vec());
- let mut answer = keyvals.0;
- answer.sort_by_key(|t| t.0);
-
- // reverse dedup: Because IndexMap::from_iter keeps the last value for
- // identical keys
- answer.reverse();
- answer.dedup_by_key(|t| t.0);
- answer.reverse();
-
- map.sort_by(|k1, _, k2, _| Ord::cmp(k1, k2));
-
- // check it contains all the values it should
- for &(key, val) in &answer {
- assert_eq!(map[&key], val);
- }
-
- // check the order
-
- let mapv = Vec::from_iter(map);
- assert_eq!(answer, mapv);
-
- }
-
- fn sort_2(keyvals: Large<Vec<(i8, i8)>>) -> () {
- let mut map: IndexMap<_, _> = IndexMap::from_iter(keyvals.to_vec());
- map.sort_by(|_, v1, _, v2| Ord::cmp(v1, v2));
- assert_sorted_by_key(map, |t| t.1);
- }
-
- fn sort_3(keyvals: Large<Vec<(i8, i8)>>) -> () {
- let mut map: IndexMap<_, _> = IndexMap::from_iter(keyvals.to_vec());
- map.sort_by_cached_key(|&k, _| std::cmp::Reverse(k));
- assert_sorted_by_key(map, |t| std::cmp::Reverse(t.0));
- }
-
- fn reverse(keyvals: Large<Vec<(i8, i8)>>) -> () {
- let mut map: IndexMap<_, _> = IndexMap::from_iter(keyvals.to_vec());
-
- fn generate_answer(input: &Vec<(i8, i8)>) -> Vec<(i8, i8)> {
- // to mimic what `IndexMap::from_iter` does:
- // need to get (A) the unique keys in forward order, and (B) the
- // last value of each of those keys.
-
- // create (A): an iterable that yields the unique keys in ltr order
- let mut seen_keys = HashSet::new();
- let unique_keys_forward = input.iter().filter_map(move |(k, _)| {
- if seen_keys.contains(k) { None }
- else { seen_keys.insert(*k); Some(*k) }
- });
-
- // create (B): a mapping of keys to the last value seen for that key
- // this is the same as reversing the input and taking the first
- // value seen for that key!
- let mut last_val_per_key = HashMap::new();
- for &(k, v) in input.iter().rev() {
- if !last_val_per_key.contains_key(&k) {
- last_val_per_key.insert(k, v);
- }
- }
-
- // iterate over the keys in (A) in order, and match each one with
- // the corresponding last value from (B)
- let mut ans: Vec<_> = unique_keys_forward
- .map(|k| (k, *last_val_per_key.get(&k).unwrap()))
- .collect();
-
- // finally, since this test is testing `.reverse()`, reverse the
- // answer in-place
- ans.reverse();
-
- ans
- }
-
- let answer = generate_answer(&keyvals.0);
-
- // perform the work
- map.reverse();
-
- // check it contains all the values it should
- for &(key, val) in &answer {
- assert_eq!(map[&key], val);
- }
-
- // check the order
- let mapv = Vec::from_iter(map);
- assert_eq!(answer, mapv);
- }
-}
-
-fn assert_sorted_by_key<I, Key, X>(iterable: I, key: Key)
-where
- I: IntoIterator,
- I::Item: Ord + Clone + Debug,
- Key: Fn(&I::Item) -> X,
- X: Ord,
-{
- let input = Vec::from_iter(iterable);
- let mut sorted = input.clone();
- sorted.sort_by_key(key);
- assert_eq!(input, sorted);
-}
-
-#[derive(Clone, Debug, Hash, PartialEq, Eq)]
-struct Alpha(String);
-
-impl Deref for Alpha {
- type Target = String;
- fn deref(&self) -> &String {
- &self.0
- }
-}
-
-const ALPHABET: &[u8] = b"abcdefghijklmnopqrstuvwxyz";
-
-impl Arbitrary for Alpha {
- fn arbitrary(g: &mut Gen) -> Self {
- let len = usize::arbitrary(g) % g.size();
- let len = min(len, 16);
- Alpha(
- (0..len)
- .map(|_| ALPHABET[usize::arbitrary(g) % ALPHABET.len()] as char)
- .collect(),
- )
- }
-
- fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
- Box::new((**self).shrink().map(Alpha))
- }
-}
-
-/// quickcheck Arbitrary adaptor -- make a larger vec
-#[derive(Clone, Debug)]
-struct Large<T>(T);
-
-impl<T> Deref for Large<T> {
- type Target = T;
- fn deref(&self) -> &T {
- &self.0
- }
-}
-
-impl<T> Arbitrary for Large<Vec<T>>
-where
- T: Arbitrary,
-{
- fn arbitrary(g: &mut Gen) -> Self {
- let len = usize::arbitrary(g) % (g.size() * 10);
- Large((0..len).map(|_| T::arbitrary(g)).collect())
- }
-
- fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
- Box::new((**self).shrink().map(Large))
- }
-}
diff --git a/vendor/indexmap/tests/tests.rs b/vendor/indexmap/tests/tests.rs
deleted file mode 100644
index 7d522f1c..00000000
--- a/vendor/indexmap/tests/tests.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-use indexmap::{indexmap, indexset};
-
-#[test]
-fn test_sort() {
- let m = indexmap! {
- 1 => 2,
- 7 => 1,
- 2 => 2,
- 3 => 3,
- };
-
- itertools::assert_equal(
- m.sorted_by(|_k1, v1, _k2, v2| v1.cmp(v2)),
- vec![(7, 1), (1, 2), (2, 2), (3, 3)],
- );
-}
-
-#[test]
-fn test_sort_set() {
- let s = indexset! {
- 1,
- 7,
- 2,
- 3,
- };
-
- itertools::assert_equal(s.sorted_by(|v1, v2| v1.cmp(v2)), vec![1, 2, 3, 7]);
-}