1use core::{
2 borrow::Borrow,
3 cmp::Ordering,
4 convert::Infallible,
5 fmt::Debug,
6 iter::FusedIterator,
7 marker::PhantomData,
8 ops::{Bound, RangeBounds},
9};
10
11use crate::{
12 iter::{UnwrappedEnumerable, UnwrappedIter},
13 unwrap::{UnwrapInfallible, UnwrapOptimized},
14};
15
16use super::{
17 env::internal::{Env as _, EnvBase as _, VecObject},
18 ConversionError, Env, IntoVal, TryFromVal, TryIntoVal, Val,
19};
20
21#[cfg(doc)]
22use crate::{storage::Storage, Bytes, BytesN, Map};
23
24#[macro_export]
39macro_rules! vec {
40 ($env:expr $(,)?) => {
41 $crate::Vec::new($env)
42 };
43 ($env:expr, $($x:expr),+ $(,)?) => {
44 $crate::Vec::from_array($env, [$($x),+])
45 };
46}
47
48pub struct Vec<T> {
89 env: Env,
90 obj: VecObject,
91 _t: PhantomData<T>,
92}
93
94impl<T> Clone for Vec<T> {
95 fn clone(&self) -> Self {
96 Self {
97 env: self.env.clone(),
98 obj: self.obj,
99 _t: self._t,
100 }
101 }
102}
103
104impl<T> Eq for Vec<T> where T: IntoVal<Env, Val> + TryFromVal<Env, Val> {}
105
106impl<T> PartialEq for Vec<T>
107where
108 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
109{
110 fn eq(&self, other: &Self) -> bool {
111 self.partial_cmp(other) == Some(Ordering::Equal)
112 }
113}
114
115impl<T> PartialOrd for Vec<T>
116where
117 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
118{
119 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
120 Some(Ord::cmp(self, other))
121 }
122}
123
124impl<T> Ord for Vec<T>
125where
126 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
127{
128 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
129 #[cfg(not(target_family = "wasm"))]
130 if !self.env.is_same_env(&other.env) {
131 return ScVal::from(self).cmp(&ScVal::from(other));
132 }
133 let v = self
134 .env
135 .obj_cmp(self.obj.to_val(), other.obj.to_val())
136 .unwrap_infallible();
137 v.cmp(&0)
138 }
139}
140
141impl<T> Debug for Vec<T>
142where
143 T: IntoVal<Env, Val> + TryFromVal<Env, Val> + Debug + Clone,
144 T::Error: Debug,
145{
146 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
147 write!(f, "Vec(")?;
148 let mut iter = self.try_iter();
149 if let Some(x) = iter.next() {
150 write!(f, "{:?}", x)?;
151 }
152 for x in iter {
153 write!(f, ", {:?}", x)?;
154 }
155 write!(f, ")")?;
156 Ok(())
157 }
158}
159
160impl<T> TryFromVal<Env, Vec<T>> for Vec<Val> {
161 type Error = Infallible;
162
163 fn try_from_val(env: &Env, v: &Vec<T>) -> Result<Self, Self::Error> {
164 Ok(unsafe { Vec::unchecked_new(env.clone(), v.obj) })
165 }
166}
167
168impl<T> TryFromVal<Env, &Vec<Val>> for Vec<T> {
172 type Error = Infallible;
173
174 fn try_from_val(env: &Env, v: &&Vec<Val>) -> Result<Self, Self::Error> {
175 Ok(unsafe { Vec::unchecked_new(env.clone(), v.obj) })
176 }
177}
178
179impl<T> TryFromVal<Env, VecObject> for Vec<T>
180where
181 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
182{
183 type Error = Infallible;
184
185 #[inline(always)]
186 fn try_from_val(env: &Env, obj: &VecObject) -> Result<Self, Self::Error> {
187 Ok(unsafe { Vec::<T>::unchecked_new(env.clone(), *obj) })
188 }
189}
190
191impl<T> TryFromVal<Env, Val> for Vec<T>
192where
193 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
194{
195 type Error = ConversionError;
196
197 #[inline(always)]
198 fn try_from_val(env: &Env, val: &Val) -> Result<Self, Self::Error> {
199 Ok(VecObject::try_from_val(env, val)?
200 .try_into_val(env)
201 .unwrap_infallible())
202 }
203}
204
205impl<T> TryFromVal<Env, Vec<T>> for Val {
206 type Error = ConversionError;
207
208 fn try_from_val(_env: &Env, v: &Vec<T>) -> Result<Self, Self::Error> {
209 Ok(v.to_val())
210 }
211}
212
213impl<T> TryFromVal<Env, &Vec<T>> for Val {
214 type Error = ConversionError;
215
216 fn try_from_val(_env: &Env, v: &&Vec<T>) -> Result<Self, Self::Error> {
217 Ok(v.to_val())
218 }
219}
220
221impl<T> From<Vec<T>> for Val
222where
223 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
224{
225 #[inline(always)]
226 fn from(v: Vec<T>) -> Self {
227 v.obj.into()
228 }
229}
230
231impl<T> From<Vec<T>> for VecObject
232where
233 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
234{
235 #[inline(always)]
236 fn from(v: Vec<T>) -> Self {
237 v.obj
238 }
239}
240
241#[cfg(not(target_family = "wasm"))]
242use super::xdr::{ScVal, ScVec, VecM};
243
244#[cfg(not(target_family = "wasm"))]
245impl<T> From<&Vec<T>> for ScVal {
246 fn from(v: &Vec<T>) -> Self {
247 ScVal::try_from_val(&v.env, &v.obj.to_val()).unwrap()
253 }
254}
255
256#[cfg(not(target_family = "wasm"))]
257impl<T> From<&Vec<T>> for ScVec {
258 fn from(v: &Vec<T>) -> Self {
259 if let ScVal::Vec(Some(vec)) = ScVal::try_from(v).unwrap() {
260 vec
261 } else {
262 panic!("expected ScVec")
263 }
264 }
265}
266
267#[cfg(not(target_family = "wasm"))]
268impl<T> From<Vec<T>> for VecM<ScVal> {
269 fn from(v: Vec<T>) -> Self {
270 ScVec::from(v).0
271 }
272}
273
274#[cfg(not(target_family = "wasm"))]
275impl<T> From<Vec<T>> for ScVal {
276 fn from(v: Vec<T>) -> Self {
277 (&v).into()
278 }
279}
280
281#[cfg(not(target_family = "wasm"))]
282impl<T> From<Vec<T>> for ScVec {
283 fn from(v: Vec<T>) -> Self {
284 (&v).into()
285 }
286}
287
288#[cfg(not(target_family = "wasm"))]
289impl<T> TryFromVal<Env, ScVal> for Vec<T>
290where
291 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
292{
293 type Error = ConversionError;
294 fn try_from_val(env: &Env, val: &ScVal) -> Result<Self, ConversionError> {
295 Ok(VecObject::try_from_val(env, &Val::try_from_val(env, val)?)?
296 .try_into_val(env)
297 .unwrap_infallible())
298 }
299}
300
301#[cfg(not(target_family = "wasm"))]
302impl<T> TryFromVal<Env, ScVec> for Vec<T>
303where
304 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
305{
306 type Error = ConversionError;
307 fn try_from_val(env: &Env, val: &ScVec) -> Result<Self, Self::Error> {
308 ScVal::Vec(Some(val.clone())).try_into_val(env)
309 }
310}
311
312#[cfg(not(target_family = "wasm"))]
313impl<T> TryFromVal<Env, VecM<ScVal>> for Vec<T>
314where
315 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
316{
317 type Error = ConversionError;
318 fn try_from_val(env: &Env, val: &VecM<ScVal>) -> Result<Self, Self::Error> {
319 ScVec(val.clone()).try_into_val(env)
320 }
321}
322
323impl<T> Vec<T> {
324 #[inline(always)]
325 pub(crate) unsafe fn unchecked_new(env: Env, obj: VecObject) -> Self {
326 Self {
327 env,
328 obj,
329 _t: PhantomData,
330 }
331 }
332
333 pub fn env(&self) -> &Env {
334 &self.env
335 }
336
337 pub fn as_val(&self) -> &Val {
338 self.obj.as_val()
339 }
340
341 pub fn to_val(&self) -> Val {
342 self.obj.to_val()
343 }
344
345 pub fn as_object(&self) -> &VecObject {
346 &self.obj
347 }
348
349 pub fn to_object(&self) -> VecObject {
350 self.obj
351 }
352
353 pub fn to_vals(&self) -> Vec<Val> {
354 unsafe { Vec::<Val>::unchecked_new(self.env().clone(), self.obj) }
355 }
356}
357
358impl<T> Vec<T>
359where
360 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
361{
362 #[inline(always)]
364 pub fn new(env: &Env) -> Vec<T> {
365 unsafe { Self::unchecked_new(env.clone(), env.vec_new().unwrap_infallible()) }
366 }
367
368 #[inline(always)]
370 pub fn from_array<const N: usize>(env: &Env, items: [T; N]) -> Vec<T> {
371 let mut tmp: [Val; N] = [Val::VOID.to_val(); N];
372 for (dst, src) in tmp.iter_mut().zip(items.iter()) {
373 *dst = src.into_val(env)
374 }
375 let vec = env.vec_new_from_slice(&tmp).unwrap_infallible();
376 unsafe { Self::unchecked_new(env.clone(), vec) }
377 }
378
379 #[inline(always)]
398 pub fn from_iter<I: IntoIterator<Item = T>>(env: &Env, iter: I) -> Vec<T> {
399 let mut vec = Self::new(env);
400 vec.extend(iter);
401 vec
402 }
403
404 #[inline(always)]
406 pub fn from_slice(env: &Env, items: &[T]) -> Vec<T>
407 where
408 T: Clone,
409 {
410 let mut vec = Vec::new(env);
411 vec.extend_from_slice(items);
412 vec
413 }
414
415 #[inline(always)]
421 pub fn get(&self, i: u32) -> Option<T> {
422 self.try_get(i).unwrap_optimized()
423 }
424
425 #[inline(always)]
431 pub fn try_get(&self, i: u32) -> Result<Option<T>, T::Error> {
432 if i < self.len() {
433 self.try_get_unchecked(i).map(|val| Some(val))
434 } else {
435 Ok(None)
436 }
437 }
438
439 #[inline(always)]
447 pub fn get_unchecked(&self, i: u32) -> T {
448 self.try_get_unchecked(i).unwrap_optimized()
449 }
450
451 #[inline(always)]
461 pub fn try_get_unchecked(&self, i: u32) -> Result<T, T::Error> {
462 let env = self.env();
463 let val = env.vec_get(self.obj, i.into()).unwrap_infallible();
464 T::try_from_val(env, &val)
465 }
466
467 #[inline(always)]
473 pub fn set(&mut self, i: u32, v: T) {
474 let env = self.env();
475 self.obj = env
476 .vec_put(self.obj, i.into(), v.into_val(env))
477 .unwrap_infallible();
478 }
479
480 #[inline(always)]
484 pub fn remove(&mut self, i: u32) -> Option<()> {
485 if i < self.len() {
486 self.remove_unchecked(i);
487 Some(())
488 } else {
489 None
490 }
491 }
492
493 #[inline(always)]
499 pub fn remove_unchecked(&mut self, i: u32) {
500 let env = self.env();
501 self.obj = env.vec_del(self.obj, i.into()).unwrap_infallible();
502 }
503
504 #[inline(always)]
509 pub fn push_front(&mut self, x: T) {
510 let env = self.env();
511 self.obj = env
512 .vec_push_front(self.obj, x.into_val(env))
513 .unwrap_infallible();
514 }
515
516 #[inline(always)]
522 pub fn pop_front(&mut self) -> Option<T> {
523 self.try_pop_front().unwrap_optimized()
524 }
525
526 #[inline(always)]
532 pub fn try_pop_front(&mut self) -> Result<Option<T>, T::Error> {
533 if self.is_empty() {
534 Ok(None)
535 } else {
536 self.try_pop_front_unchecked().map(|val| Some(val))
537 }
538 }
539
540 #[inline(always)]
548 pub fn pop_front_unchecked(&mut self) -> T {
549 self.try_pop_front_unchecked().unwrap_optimized()
550 }
551
552 #[inline(always)]
562 pub fn try_pop_front_unchecked(&mut self) -> Result<T, T::Error> {
563 let last = self.try_first_unchecked()?;
564 let env = self.env();
565 self.obj = env.vec_pop_front(self.obj).unwrap_infallible();
566 Ok(last)
567 }
568
569 #[inline(always)]
573 pub fn push_back(&mut self, x: T) {
574 let env = self.env();
575 self.obj = env
576 .vec_push_back(self.obj, x.into_val(env))
577 .unwrap_infallible();
578 }
579
580 #[inline(always)]
586 pub fn pop_back(&mut self) -> Option<T> {
587 self.try_pop_back().unwrap_optimized()
588 }
589
590 #[inline(always)]
596 pub fn try_pop_back(&mut self) -> Result<Option<T>, T::Error> {
597 if self.is_empty() {
598 Ok(None)
599 } else {
600 self.try_pop_back_unchecked().map(|val| Some(val))
601 }
602 }
603
604 #[inline(always)]
612 pub fn pop_back_unchecked(&mut self) -> T {
613 self.try_pop_back_unchecked().unwrap_optimized()
614 }
615
616 #[inline(always)]
626 pub fn try_pop_back_unchecked(&mut self) -> Result<T, T::Error> {
627 let last = self.try_last_unchecked()?;
628 let env = self.env();
629 self.obj = env.vec_pop_back(self.obj).unwrap_infallible();
630 Ok(last)
631 }
632
633 #[inline(always)]
639 pub fn first(&self) -> Option<T> {
640 self.try_first().unwrap_optimized()
641 }
642
643 #[inline(always)]
649 pub fn try_first(&self) -> Result<Option<T>, T::Error> {
650 if self.is_empty() {
651 Ok(None)
652 } else {
653 self.try_first_unchecked().map(|val| Some(val))
654 }
655 }
656
657 #[inline(always)]
665 pub fn first_unchecked(&self) -> T {
666 self.try_first_unchecked().unwrap_optimized()
667 }
668
669 #[inline(always)]
679 pub fn try_first_unchecked(&self) -> Result<T, T::Error> {
680 let env = &self.env;
681 let val = env.vec_front(self.obj).unwrap_infallible();
682 T::try_from_val(env, &val)
683 }
684
685 #[inline(always)]
691 pub fn last(&self) -> Option<T> {
692 self.try_last().unwrap_optimized()
693 }
694
695 #[inline(always)]
701 pub fn try_last(&self) -> Result<Option<T>, T::Error> {
702 if self.is_empty() {
703 Ok(None)
704 } else {
705 self.try_last_unchecked().map(|val| Some(val))
706 }
707 }
708
709 #[inline(always)]
717 pub fn last_unchecked(&self) -> T {
718 self.try_last_unchecked().unwrap_optimized()
719 }
720
721 #[inline(always)]
731 pub fn try_last_unchecked(&self) -> Result<T, T::Error> {
732 let env = self.env();
733 let val = env.vec_back(self.obj).unwrap_infallible();
734 T::try_from_val(env, &val)
735 }
736
737 #[inline(always)]
743 pub fn insert(&mut self, i: u32, x: T) {
744 let env = self.env();
745 self.obj = env
746 .vec_insert(self.obj, i.into(), x.into_val(env))
747 .unwrap_infallible();
748 }
749
750 #[inline(always)]
752 pub fn append(&mut self, other: &Vec<T>) {
753 let env = self.env();
754 self.obj = env.vec_append(self.obj, other.obj).unwrap_infallible();
755 }
756
757 #[inline(always)]
759 pub fn extend_from_array<const N: usize>(&mut self, items: [T; N]) {
760 self.append(&Self::from_array(&self.env, items))
761 }
762
763 #[inline(always)]
765 pub fn extend_from_slice(&mut self, items: &[T])
766 where
767 T: Clone,
768 {
769 for item in items {
770 self.push_back(item.clone());
771 }
772 }
773}
774
775impl<T> Vec<T> {
776 #[must_use]
783 pub fn slice(&self, r: impl RangeBounds<u32>) -> Self {
784 let start_bound = match r.start_bound() {
785 Bound::Included(s) => *s,
786 Bound::Excluded(s) => s
787 .checked_add(1)
788 .expect_optimized("attempt to add with overflow"),
789 Bound::Unbounded => 0,
790 };
791 let end_bound = match r.end_bound() {
792 Bound::Included(s) => s
793 .checked_add(1)
794 .expect_optimized("attempt to add with overflow"),
795 Bound::Excluded(s) => *s,
796 Bound::Unbounded => self.len(),
797 };
798 let env = self.env();
799 let obj = env
800 .vec_slice(self.obj, start_bound.into(), end_bound.into())
801 .unwrap_infallible();
802 unsafe { Self::unchecked_new(env.clone(), obj) }
803 }
804
805 pub fn shuffle(&mut self) {
814 let env = self.env();
815 env.prng().shuffle(self);
816 }
817
818 #[must_use]
827 pub fn to_shuffled(&self) -> Self {
828 let mut copy = self.clone();
829 copy.shuffle();
830 copy
831 }
832
833 #[inline(always)]
835 pub fn is_empty(&self) -> bool {
836 self.len() == 0
837 }
838
839 #[inline(always)]
841 pub fn len(&self) -> u32 {
842 self.env.vec_len(self.obj).unwrap_infallible().into()
843 }
844}
845
846impl<T> Vec<T>
847where
848 T: IntoVal<Env, Val>,
849{
850 #[inline(always)]
852 pub fn contains(&self, item: impl Borrow<T>) -> bool {
853 let env = self.env();
854 let val = item.borrow().into_val(env);
855 !env.vec_first_index_of(self.obj, val)
856 .unwrap_infallible()
857 .is_void()
858 }
859
860 #[inline(always)]
864 pub fn first_index_of(&self, item: impl Borrow<T>) -> Option<u32> {
865 let env = self.env();
866 let val = item.borrow().into_val(env);
867 env.vec_first_index_of(self.obj, val)
868 .unwrap_infallible()
869 .try_into_val(env)
870 .unwrap()
871 }
872
873 #[inline(always)]
877 pub fn last_index_of(&self, item: impl Borrow<T>) -> Option<u32> {
878 let env = self.env();
879 let val = item.borrow().into_val(env);
880 env.vec_last_index_of(self.obj, val)
881 .unwrap_infallible()
882 .try_into_val(env)
883 .unwrap()
884 }
885
886 #[inline(always)]
896 pub fn binary_search(&self, item: impl Borrow<T>) -> Result<u32, u32> {
897 let env = self.env();
898 let val = item.borrow().into_val(env);
899 let high_low = env.vec_binary_search(self.obj, val).unwrap_infallible();
900 let high: u32 = (high_low >> u32::BITS) as u32;
901 let low: u32 = high_low as u32;
902 if high == 1 {
903 Ok(low)
904 } else {
905 Err(low)
906 }
907 }
908}
909
910impl<T> Vec<Vec<T>>
911where
912 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
913 T: Clone,
914{
915 #[inline(always)]
916 pub fn concat(&self) -> Vec<T> {
917 let mut concatenated = vec![self.env()];
918 for vec in self.iter() {
919 concatenated.append(&vec);
920 }
921 concatenated
922 }
923}
924
925impl<T> IntoIterator for Vec<T>
926where
927 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
928{
929 type Item = T;
930 type IntoIter = UnwrappedIter<VecTryIter<T>, T, T::Error>;
931
932 fn into_iter(self) -> Self::IntoIter {
933 VecTryIter::new(self).unwrapped()
934 }
935}
936
937impl<T> IntoIterator for &Vec<T>
938where
939 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
940{
941 type Item = T;
942 type IntoIter = UnwrappedIter<VecTryIter<T>, T, T::Error>;
943
944 fn into_iter(self) -> Self::IntoIter {
945 self.clone().into_iter()
946 }
947}
948
949impl<T> Extend<T> for Vec<T>
950where
951 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
952{
953 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
954 for item in iter {
955 self.push_back(item);
956 }
957 }
958}
959
960impl<T> Vec<T>
961where
962 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
963{
964 #[inline(always)]
973 pub fn iter(&self) -> UnwrappedIter<VecTryIter<T>, T, T::Error>
974 where
975 T: IntoVal<Env, Val> + TryFromVal<Env, Val> + Clone,
976 T::Error: Debug,
977 {
978 self.try_iter().unwrapped()
979 }
980
981 #[inline(always)]
984 pub fn try_iter(&self) -> VecTryIter<T>
985 where
986 T: IntoVal<Env, Val> + TryFromVal<Env, Val> + Clone,
987 {
988 VecTryIter::new(self.clone())
989 }
990
991 #[inline(always)]
992 pub fn into_try_iter(self) -> VecTryIter<T>
993 where
994 T: IntoVal<Env, Val> + TryFromVal<Env, Val> + Clone,
995 T::Error: Debug,
996 {
997 VecTryIter::new(self)
998 }
999}
1000
1001#[derive(Clone)]
1002pub struct VecTryIter<T> {
1003 vec: Vec<T>,
1004 start: u32, end: u32, }
1007
1008impl<T> VecTryIter<T> {
1009 fn new(vec: Vec<T>) -> Self {
1010 Self {
1011 start: 0,
1012 end: vec.len(),
1013 vec,
1014 }
1015 }
1016
1017 fn into_vec(self) -> Vec<T> {
1018 self.vec.slice(self.start..self.end)
1019 }
1020}
1021
1022impl<T> Iterator for VecTryIter<T>
1023where
1024 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
1025{
1026 type Item = Result<T, T::Error>;
1027
1028 fn next(&mut self) -> Option<Self::Item> {
1029 if self.start < self.end {
1030 let val = self.vec.try_get_unchecked(self.start);
1031 self.start += 1;
1032 Some(val)
1033 } else {
1034 None
1035 }
1036 }
1037
1038 fn size_hint(&self) -> (usize, Option<usize>) {
1039 let len = (self.end - self.start) as usize;
1040 (len, Some(len))
1041 }
1042
1043 }
1046
1047impl<T> DoubleEndedIterator for VecTryIter<T>
1048where
1049 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
1050{
1051 fn next_back(&mut self) -> Option<Self::Item> {
1052 if self.start < self.end {
1053 let val = self.vec.try_get_unchecked(self.end - 1);
1054 self.end -= 1;
1055 Some(val)
1056 } else {
1057 None
1058 }
1059 }
1060
1061 }
1064
1065impl<T> FusedIterator for VecTryIter<T> where T: IntoVal<Env, Val> + TryFromVal<Env, Val> {}
1066
1067impl<T> ExactSizeIterator for VecTryIter<T>
1068where
1069 T: IntoVal<Env, Val> + TryFromVal<Env, Val>,
1070{
1071 fn len(&self) -> usize {
1072 (self.end - self.start) as usize
1073 }
1074}
1075
1076#[cfg(test)]
1077mod test {
1078 use super::*;
1079
1080 #[test]
1081 fn test_vec_macro() {
1082 let env = Env::default();
1083 assert_eq!(vec![&env], Vec::<i32>::new(&env));
1084 assert_eq!(vec![&env,], Vec::<i32>::new(&env));
1085 assert_eq!(vec![&env, 1], {
1086 let mut v = Vec::new(&env);
1087 v.push_back(1);
1088 v
1089 });
1090 assert_eq!(vec![&env, 1,], {
1091 let mut v = Vec::new(&env);
1092 v.push_back(1);
1093 v
1094 });
1095 assert_eq!(vec![&env, 3, 2, 1,], {
1096 let mut v = Vec::new(&env);
1097 v.push_back(3);
1098 v.push_back(2);
1099 v.push_back(1);
1100 v
1101 });
1102 }
1103
1104 #[test]
1105 fn test_vec_to_val() {
1106 let env = Env::default();
1107
1108 let vec = Vec::<u32>::from_slice(&env, &[0, 1, 2, 3]);
1109 let val: Val = vec.clone().into_val(&env);
1110 let rt: Vec<u32> = val.into_val(&env);
1111
1112 assert_eq!(vec, rt);
1113 }
1114
1115 #[test]
1116 fn test_ref_vec_to_val() {
1117 let env = Env::default();
1118
1119 let vec = Vec::<u32>::from_slice(&env, &[0, 1, 2, 3]);
1120 let val: Val = (&vec).into_val(&env);
1121 let rt: Vec<u32> = val.into_val(&env);
1122
1123 assert_eq!(vec, rt);
1124 }
1125
1126 #[test]
1127 fn test_double_ref_vec_to_val() {
1128 let env = Env::default();
1129
1130 let vec = Vec::<u32>::from_slice(&env, &[0, 1, 2, 3]);
1131 let val: Val = (&&vec).into_val(&env);
1132 let rt: Vec<u32> = val.into_val(&env);
1133
1134 assert_eq!(vec, rt);
1135 }
1136
1137 #[test]
1138 fn test_vec_raw_val_type() {
1139 let env = Env::default();
1140
1141 let mut vec = Vec::<u32>::new(&env);
1142 assert_eq!(vec.len(), 0);
1143 vec.push_back(10);
1144 assert_eq!(vec.len(), 1);
1145 vec.push_back(20);
1146 assert_eq!(vec.len(), 2);
1147 vec.push_back(30);
1148 assert_eq!(vec.len(), 3);
1149
1150 let vec_ref = &vec;
1151 assert_eq!(vec_ref.len(), 3);
1152
1153 let mut vec_copy = vec.clone();
1154 assert!(vec == vec_copy);
1155 assert_eq!(vec_copy.len(), 3);
1156 vec_copy.push_back(40);
1157 assert_eq!(vec_copy.len(), 4);
1158 assert!(vec != vec_copy);
1159
1160 assert_eq!(vec.len(), 3);
1161 assert_eq!(vec_ref.len(), 3);
1162
1163 _ = vec_copy.pop_back_unchecked();
1164 assert!(vec == vec_copy);
1165 }
1166
1167 #[test]
1168 fn test_vec_env_val_type() {
1169 let env = Env::default();
1170
1171 let mut vec = Vec::<i64>::new(&env);
1172 assert_eq!(vec.len(), 0);
1173 vec.push_back(-10);
1174 assert_eq!(vec.len(), 1);
1175 vec.push_back(20);
1176 assert_eq!(vec.len(), 2);
1177 vec.push_back(-30);
1178 assert_eq!(vec.len(), 3);
1179
1180 let vec_ref = &vec;
1181 assert_eq!(vec_ref.len(), 3);
1182
1183 let mut vec_copy = vec.clone();
1184 assert!(vec == vec_copy);
1185 assert_eq!(vec_copy.len(), 3);
1186 vec_copy.push_back(40);
1187 assert_eq!(vec_copy.len(), 4);
1188 assert!(vec != vec_copy);
1189
1190 assert_eq!(vec.len(), 3);
1191 assert_eq!(vec_ref.len(), 3);
1192
1193 _ = vec_copy.pop_back_unchecked();
1194 assert!(vec == vec_copy);
1195 }
1196
1197 #[test]
1198 fn test_vec_to_vals() {
1199 let env = Env::default();
1200 let vec = vec![&env, 0, 1, 2, 3, 4];
1201 let vals = vec.to_vals();
1202 assert_eq!(
1203 vals,
1204 vec![
1205 &env,
1206 Val::from_i32(0).to_val(),
1207 Val::from_i32(1).to_val(),
1208 Val::from_i32(2).to_val(),
1209 Val::from_i32(3).to_val(),
1210 Val::from_i32(4).to_val(),
1211 ]
1212 );
1213 }
1214
1215 #[test]
1216 fn test_vec_recursive() {
1217 let env = Env::default();
1218
1219 let mut vec_inner = Vec::<i64>::new(&env);
1220 vec_inner.push_back(-10);
1221 assert_eq!(vec_inner.len(), 1);
1222
1223 let mut vec_outer = Vec::<Vec<i64>>::new(&env);
1224 vec_outer.push_back(vec_inner);
1225 assert_eq!(vec_outer.len(), 1);
1226 }
1227
1228 #[test]
1229 fn test_vec_concat() {
1230 let env = Env::default();
1231 let vec_1: Vec<i64> = vec![&env, 1, 2, 3];
1232 let vec_2: Vec<i64> = vec![&env, 4, 5, 6];
1233 let vec = vec![&env, vec_1, vec_2].concat();
1234 assert_eq!(vec, vec![&env, 1, 2, 3, 4, 5, 6]);
1235 }
1236
1237 #[test]
1238 fn test_vec_slice() {
1239 let env = Env::default();
1240
1241 let vec = vec![&env, 0, 1, 2, 3, 4];
1242 assert_eq!(vec.len(), 5);
1243
1244 let slice = vec.slice(..);
1245 assert_eq!(slice, vec![&env, 0, 1, 2, 3, 4]);
1246
1247 let slice = vec.slice(0..5);
1248 assert_eq!(slice, vec![&env, 0, 1, 2, 3, 4]);
1249
1250 let slice = vec.slice(0..=4);
1251 assert_eq!(slice, vec![&env, 0, 1, 2, 3, 4]);
1252
1253 let slice = vec.slice(1..);
1254 assert_eq!(slice, vec![&env, 1, 2, 3, 4]);
1255
1256 let slice = vec.slice(..4);
1257 assert_eq!(slice, vec![&env, 0, 1, 2, 3]);
1258
1259 let slice = vec.slice(..=3);
1260 assert_eq!(slice, vec![&env, 0, 1, 2, 3]);
1261
1262 let slice = vec.slice(1..4);
1263 assert_eq!(slice, vec![&env, 1, 2, 3]);
1264
1265 let slice = vec.slice(1..=3);
1266 assert_eq!(slice, vec![&env, 1, 2, 3]);
1267
1268 let slice = vec.slice((Bound::Excluded(0), Bound::Included(3)));
1272 assert_eq!(slice, vec![&env, 1, 2, 3]);
1273 let slice = vec.slice((Bound::Excluded(0), Bound::Excluded(3)));
1274 assert_eq!(slice, vec![&env, 1, 2]);
1275 }
1276
1277 #[test]
1278 fn test_vec_iter() {
1279 let env = Env::default();
1280
1281 let vec: Vec<()> = vec![&env];
1282 let mut iter = vec.iter();
1283 assert_eq!(iter.len(), 0);
1284 assert_eq!(iter.next(), None);
1285 assert_eq!(iter.next(), None);
1286
1287 let vec = vec![&env, 0, 1, 2, 3, 4];
1288
1289 let mut iter = vec.iter();
1290 assert_eq!(iter.len(), 5);
1291 assert_eq!(iter.next(), Some(0));
1292 assert_eq!(iter.len(), 4);
1293 assert_eq!(iter.next(), Some(1));
1294 assert_eq!(iter.len(), 3);
1295 assert_eq!(iter.next(), Some(2));
1296 assert_eq!(iter.len(), 2);
1297 assert_eq!(iter.next(), Some(3));
1298 assert_eq!(iter.len(), 1);
1299 assert_eq!(iter.next(), Some(4));
1300 assert_eq!(iter.len(), 0);
1301 assert_eq!(iter.next(), None);
1302 assert_eq!(iter.next(), None);
1303
1304 let mut iter = vec.iter();
1305 assert_eq!(iter.len(), 5);
1306 assert_eq!(iter.next(), Some(0));
1307 assert_eq!(iter.len(), 4);
1308 assert_eq!(iter.next_back(), Some(4));
1309 assert_eq!(iter.len(), 3);
1310 assert_eq!(iter.next_back(), Some(3));
1311 assert_eq!(iter.len(), 2);
1312 assert_eq!(iter.next(), Some(1));
1313 assert_eq!(iter.len(), 1);
1314 assert_eq!(iter.next(), Some(2));
1315 assert_eq!(iter.len(), 0);
1316 assert_eq!(iter.next(), None);
1317 assert_eq!(iter.next(), None);
1318 assert_eq!(iter.next_back(), None);
1319 assert_eq!(iter.next_back(), None);
1320
1321 let mut iter = vec.iter().rev();
1322 assert_eq!(iter.next(), Some(4));
1323 assert_eq!(iter.next_back(), Some(0));
1324 assert_eq!(iter.next_back(), Some(1));
1325 assert_eq!(iter.next(), Some(3));
1326 assert_eq!(iter.next(), Some(2));
1327 assert_eq!(iter.next(), None);
1328 assert_eq!(iter.next(), None);
1329 assert_eq!(iter.next_back(), None);
1330 assert_eq!(iter.next_back(), None);
1331 }
1332
1333 #[test]
1334 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1335 fn test_vec_iter_panic_on_conversion() {
1336 let env = Env::default();
1337
1338 let vec: Val = (1i32,).try_into_val(&env).unwrap();
1339 let vec: Vec<i64> = vec.try_into_val(&env).unwrap();
1340
1341 let mut iter = vec.iter();
1342 iter.next();
1343 }
1344
1345 #[test]
1346 fn test_vec_try_iter() {
1347 let env = Env::default();
1348
1349 let vec: Vec<()> = vec![&env];
1350 let mut iter = vec.try_iter();
1351 assert_eq!(iter.len(), 0);
1352 assert_eq!(iter.next(), None);
1353 assert_eq!(iter.next(), None);
1354
1355 let vec = vec![&env, 0, 1, 2, 3, 4];
1356
1357 let mut iter = vec.try_iter();
1358 assert_eq!(iter.len(), 5);
1359 assert_eq!(iter.next(), Some(Ok(0)));
1360 assert_eq!(iter.len(), 4);
1361 assert_eq!(iter.next(), Some(Ok(1)));
1362 assert_eq!(iter.len(), 3);
1363 assert_eq!(iter.next(), Some(Ok(2)));
1364 assert_eq!(iter.len(), 2);
1365 assert_eq!(iter.next(), Some(Ok(3)));
1366 assert_eq!(iter.len(), 1);
1367 assert_eq!(iter.next(), Some(Ok(4)));
1368 assert_eq!(iter.len(), 0);
1369 assert_eq!(iter.next(), None);
1370 assert_eq!(iter.next(), None);
1371
1372 let mut iter = vec.try_iter();
1373 assert_eq!(iter.len(), 5);
1374 assert_eq!(iter.next(), Some(Ok(0)));
1375 assert_eq!(iter.len(), 4);
1376 assert_eq!(iter.next_back(), Some(Ok(4)));
1377 assert_eq!(iter.len(), 3);
1378 assert_eq!(iter.next_back(), Some(Ok(3)));
1379 assert_eq!(iter.len(), 2);
1380 assert_eq!(iter.next(), Some(Ok(1)));
1381 assert_eq!(iter.len(), 1);
1382 assert_eq!(iter.next(), Some(Ok(2)));
1383 assert_eq!(iter.len(), 0);
1384 assert_eq!(iter.next(), None);
1385 assert_eq!(iter.next(), None);
1386 assert_eq!(iter.next_back(), None);
1387 assert_eq!(iter.next_back(), None);
1388
1389 let mut iter = vec.try_iter().rev();
1390 assert_eq!(iter.next(), Some(Ok(4)));
1391 assert_eq!(iter.next_back(), Some(Ok(0)));
1392 assert_eq!(iter.next_back(), Some(Ok(1)));
1393 assert_eq!(iter.next(), Some(Ok(3)));
1394 assert_eq!(iter.next(), Some(Ok(2)));
1395 assert_eq!(iter.next(), None);
1396 assert_eq!(iter.next(), None);
1397 assert_eq!(iter.next_back(), None);
1398 assert_eq!(iter.next_back(), None);
1399 }
1400
1401 #[test]
1402 fn test_vec_try_iter_error_on_conversion() {
1403 let env = Env::default();
1404
1405 let vec: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1406 let vec: Vec<i64> = vec.try_into_val(&env).unwrap();
1407
1408 let mut iter = vec.try_iter();
1409 assert_eq!(iter.next(), Some(Ok(1)));
1410 assert_eq!(iter.next(), Some(Err(ConversionError.into())));
1411 }
1412
1413 #[test]
1414 fn test_vec_iter_into_vec() {
1415 let env = Env::default();
1416
1417 let vec = vec![&env, 0, 1, 2, 3, 4];
1418
1419 let mut iter = vec.try_iter();
1420 assert_eq!(iter.next(), Some(Ok(0)));
1421 assert_eq!(iter.next(), Some(Ok(1)));
1422 assert_eq!(iter.into_vec(), vec![&env, 2, 3, 4]);
1423 }
1424
1425 #[test]
1426 fn test_contains() {
1427 let env = Env::default();
1428 let vec = vec![&env, 0, 3, 5, 7, 9, 5];
1429 assert_eq!(vec.contains(&2), false);
1430 assert_eq!(vec.contains(2), false);
1431 assert_eq!(vec.contains(&3), true);
1432 assert_eq!(vec.contains(3), true);
1433 assert_eq!(vec.contains(&5), true);
1434 assert_eq!(vec.contains(5), true);
1435 }
1436
1437 #[test]
1438 fn test_first_index_of() {
1439 let env = Env::default();
1440
1441 let vec = vec![&env, 0, 3, 5, 7, 9, 5];
1442 assert_eq!(vec.first_index_of(&2), None);
1443 assert_eq!(vec.first_index_of(2), None);
1444 assert_eq!(vec.first_index_of(&3), Some(1));
1445 assert_eq!(vec.first_index_of(3), Some(1));
1446 assert_eq!(vec.first_index_of(&5), Some(2));
1447 assert_eq!(vec.first_index_of(5), Some(2));
1448 }
1449
1450 #[test]
1451 fn test_last_index_of() {
1452 let env = Env::default();
1453
1454 let vec = vec![&env, 0, 3, 5, 7, 9, 5];
1455 assert_eq!(vec.last_index_of(&2), None);
1456 assert_eq!(vec.last_index_of(2), None);
1457 assert_eq!(vec.last_index_of(&3), Some(1));
1458 assert_eq!(vec.last_index_of(3), Some(1));
1459 assert_eq!(vec.last_index_of(&5), Some(5));
1460 assert_eq!(vec.last_index_of(5), Some(5));
1461 }
1462
1463 #[test]
1464 fn test_binary_search() {
1465 let env = Env::default();
1466
1467 let vec = vec![&env, 0, 3, 5, 5, 7, 9];
1468 assert_eq!(vec.binary_search(&2), Err(1));
1469 assert_eq!(vec.binary_search(2), Err(1));
1470 assert_eq!(vec.binary_search(&3), Ok(1));
1471 assert_eq!(vec.binary_search(3), Ok(1));
1472 assert_eq!(vec.binary_search(&5), Ok(3));
1473 assert_eq!(vec.binary_search(5), Ok(3));
1474 }
1475
1476 #[cfg(not(target_family = "wasm"))]
1477 #[test]
1478 fn test_scval_accessibility_from_udt_types() {
1479 use crate::TryFromVal;
1480 let env = Env::default();
1481 let v = vec![&env, 1];
1482 let val: ScVal = v.clone().try_into().unwrap();
1483 let roundtrip = Vec::<i64>::try_from_val(&env, &val).unwrap();
1484 assert_eq!(v, roundtrip);
1485 }
1486
1487 #[test]
1488 fn test_insert_and_set() {
1489 let env = Env::default();
1490 let mut v = Vec::<i64>::new(&env);
1491 v.insert(0, 3);
1492 v.insert(0, 1);
1493 v.insert(1, 4);
1494 v.insert(3, 6);
1495 assert_eq!(v, vec![&env, 1, 4, 3, 6]);
1496 v.set(0, 7);
1497 v.set(1, 6);
1498 v.set(2, 2);
1499 v.set(3, 5);
1500 assert_eq!(v, vec![&env, 7, 6, 2, 5]);
1501 }
1502
1503 #[test]
1504 fn test_is_empty_and_len() {
1505 let env = Env::default();
1506
1507 let mut v: Vec<i32> = vec![&env, 1, 4, 3];
1508 assert_eq!(v.is_empty(), false);
1509 assert_eq!(v.len(), 3);
1510
1511 v = vec![&env];
1512 assert_eq!(v.is_empty(), true);
1513 assert_eq!(v.len(), 0);
1514 }
1515
1516 #[test]
1517 fn test_push_pop_front() {
1518 let env = Env::default();
1519
1520 let mut v = Vec::<i64>::new(&env);
1521 v.push_front(42);
1522 assert_eq!(v, vec![&env, 42]);
1523 v.push_front(1);
1524 assert_eq!(v, vec![&env, 1, 42]);
1525 v.push_front(5);
1526 assert_eq!(v, vec![&env, 5, 1, 42]);
1527 v.push_front(7);
1528 assert_eq!(v, vec![&env, 7, 5, 1, 42]);
1529
1530 let popped = v.pop_front();
1531 assert_eq!(popped, Some(7));
1532 assert_eq!(v, vec![&env, 5, 1, 42]);
1533
1534 let popped = v.try_pop_front();
1535 assert_eq!(popped, Ok(Some(5)));
1536 assert_eq!(v, vec![&env, 1, 42]);
1537
1538 let popped = v.pop_front_unchecked();
1539 assert_eq!(popped, 1);
1540 assert_eq!(v, vec![&env, 42]);
1541
1542 let popped = v.try_pop_front_unchecked();
1543 assert_eq!(popped, Ok(42));
1544 assert_eq!(v, vec![&env]);
1545
1546 assert_eq!(v.pop_front(), None);
1547 }
1548
1549 #[test]
1550 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1551 fn test_pop_front_panics_on_conversion() {
1552 let env = Env::default();
1553
1554 let v: Val = (1i32,).try_into_val(&env).unwrap();
1555 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1556
1557 v.pop_front();
1558 }
1559
1560 #[test]
1561 fn test_try_pop_front_errors_on_conversion() {
1562 let env = Env::default();
1563
1564 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1565 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1566
1567 assert_eq!(v.try_pop_front(), Ok(Some(1)));
1568 assert_eq!(v.try_pop_front(), Err(ConversionError.into()));
1569 }
1570
1571 #[test]
1572 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1573 fn test_pop_front_unchecked_panics_on_conversion() {
1574 let env = Env::default();
1575
1576 let v: Val = (1i32,).try_into_val(&env).unwrap();
1577 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1578
1579 v.pop_front_unchecked();
1580 }
1581
1582 #[test]
1583 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1584 fn test_pop_front_unchecked_panics_on_out_of_bounds() {
1585 let env = Env::default();
1586
1587 let mut v = Vec::<i64>::new(&env);
1588
1589 v.pop_front_unchecked();
1590 }
1591
1592 #[test]
1593 fn test_try_pop_front_unchecked_errors_on_conversion() {
1594 let env = Env::default();
1595
1596 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1597 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1598
1599 assert_eq!(v.try_pop_front_unchecked(), Ok(1));
1600 assert_eq!(v.try_pop_front_unchecked(), Err(ConversionError.into()));
1601 }
1602
1603 #[test]
1604 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1605 fn test_try_pop_front_unchecked_panics_on_out_of_bounds() {
1606 let env = Env::default();
1607
1608 let mut v = Vec::<i64>::new(&env);
1609
1610 let _ = v.try_pop_front_unchecked();
1611 }
1612
1613 #[test]
1614 fn test_push_pop_back() {
1615 let env = Env::default();
1616
1617 let mut v = Vec::<i64>::new(&env);
1618 v.push_back(42);
1619 assert_eq!(v, vec![&env, 42]);
1620 v.push_back(1);
1621 assert_eq!(v, vec![&env, 42, 1]);
1622 v.push_back(5);
1623 assert_eq!(v, vec![&env, 42, 1, 5]);
1624 v.push_back(7);
1625 assert_eq!(v, vec![&env, 42, 1, 5, 7]);
1626
1627 let popped = v.pop_back();
1628 assert_eq!(popped, Some(7));
1629 assert_eq!(v, vec![&env, 42, 1, 5]);
1630
1631 let popped = v.try_pop_back();
1632 assert_eq!(popped, Ok(Some(5)));
1633 assert_eq!(v, vec![&env, 42, 1]);
1634
1635 let popped = v.pop_back_unchecked();
1636 assert_eq!(popped, 1);
1637 assert_eq!(v, vec![&env, 42]);
1638
1639 let popped = v.try_pop_back_unchecked();
1640 assert_eq!(popped, Ok(42));
1641 assert_eq!(v, vec![&env]);
1642
1643 assert_eq!(v.pop_back(), None);
1644 }
1645
1646 #[test]
1647 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1648 fn test_pop_back_panics_on_conversion() {
1649 let env = Env::default();
1650
1651 let v: Val = (1i32,).try_into_val(&env).unwrap();
1652 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1653
1654 v.pop_back();
1655 }
1656
1657 #[test]
1658 fn test_try_pop_back_errors_on_conversion() {
1659 let env = Env::default();
1660
1661 let v: Val = (1i32, 2i64).try_into_val(&env).unwrap();
1662 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1663
1664 assert_eq!(v.try_pop_back(), Ok(Some(2)));
1665 assert_eq!(v.try_pop_back(), Err(ConversionError.into()));
1666 }
1667
1668 #[test]
1669 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1670 fn test_pop_back_unchecked_panics_on_conversion() {
1671 let env = Env::default();
1672
1673 let v: Val = (1i32,).try_into_val(&env).unwrap();
1674 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1675
1676 v.pop_back_unchecked();
1677 }
1678
1679 #[test]
1680 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1681 fn test_pop_back_unchecked_panics_on_out_of_bounds() {
1682 let env = Env::default();
1683
1684 let mut v = Vec::<i64>::new(&env);
1685
1686 v.pop_back_unchecked();
1687 }
1688
1689 #[test]
1690 fn test_try_pop_back_unchecked_errors_on_conversion() {
1691 let env = Env::default();
1692
1693 let v: Val = (1i32, 2i64).try_into_val(&env).unwrap();
1694 let mut v: Vec<i64> = v.try_into_val(&env).unwrap();
1695
1696 assert_eq!(v.try_pop_back_unchecked(), Ok(2));
1697 assert_eq!(v.try_pop_back_unchecked(), Err(ConversionError.into()));
1698 }
1699
1700 #[test]
1701 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1702 fn test_try_pop_back_unchecked_panics_on_out_of_bounds() {
1703 let env = Env::default();
1704
1705 let mut v = Vec::<i64>::new(&env);
1706
1707 let _ = v.try_pop_back_unchecked();
1708 }
1709
1710 #[test]
1711 fn test_get() {
1712 let env = Env::default();
1713
1714 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1715
1716 assert_eq!(v.get(3), Some(5));
1718 assert_eq!(v.get(0), Some(0));
1719 assert_eq!(v.get(1), Some(3));
1720 assert_eq!(v.get(2), Some(5));
1721 assert_eq!(v.get(5), Some(9));
1722 assert_eq!(v.get(4), Some(7));
1723
1724 assert_eq!(v.get(v.len()), None);
1725 assert_eq!(v.get(v.len() + 1), None);
1726 assert_eq!(v.get(u32::MAX), None);
1727
1728 let v = Vec::<i64>::new(&env);
1730 assert_eq!(v.get(0), None);
1731 assert_eq!(v.get(v.len()), None);
1732 assert_eq!(v.get(v.len() + 1), None);
1733 assert_eq!(v.get(u32::MAX), None);
1734 }
1735
1736 #[test]
1737 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1738 fn test_get_panics_on_conversion() {
1739 let env = Env::default();
1740
1741 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1742 let v: Vec<i64> = v.try_into_val(&env).unwrap();
1743
1744 assert_eq!(v.get(1), Some(5));
1746 }
1747
1748 #[test]
1749 fn test_try_get() {
1750 let env = Env::default();
1751
1752 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1753
1754 assert_eq!(v.try_get(3), Ok(Some(5)));
1756 assert_eq!(v.try_get(0), Ok(Some(0)));
1757 assert_eq!(v.try_get(1), Ok(Some(3)));
1758 assert_eq!(v.try_get(2), Ok(Some(5)));
1759 assert_eq!(v.try_get(5), Ok(Some(9)));
1760 assert_eq!(v.try_get(4), Ok(Some(7)));
1761
1762 assert_eq!(v.try_get(v.len()), Ok(None));
1763 assert_eq!(v.try_get(v.len() + 1), Ok(None));
1764 assert_eq!(v.try_get(u32::MAX), Ok(None));
1765
1766 let v = Vec::<i64>::new(&env);
1768 assert_eq!(v.try_get(0), Ok(None));
1769 assert_eq!(v.try_get(v.len()), Ok(None));
1770 assert_eq!(v.try_get(v.len() + 1), Ok(None));
1771 assert_eq!(v.try_get(u32::MAX), Ok(None));
1772
1773 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1775 let v: Vec<i64> = v.try_into_val(&env).unwrap();
1776 assert_eq!(v.try_get(0), Ok(Some(1)));
1777 assert_eq!(v.try_get(1), Err(ConversionError.into()));
1778 }
1779
1780 #[test]
1781 fn test_get_unchecked() {
1782 let env = Env::default();
1783
1784 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1785
1786 assert_eq!(v.get_unchecked(3), 5);
1788 assert_eq!(v.get_unchecked(0), 0);
1789 assert_eq!(v.get_unchecked(1), 3);
1790 assert_eq!(v.get_unchecked(2), 5);
1791 assert_eq!(v.get_unchecked(5), 9);
1792 assert_eq!(v.get_unchecked(4), 7);
1793 }
1794
1795 #[test]
1796 #[should_panic(expected = "Error(Value, UnexpectedType)")]
1797 fn test_get_unchecked_panics_on_conversion() {
1798 let env = Env::default();
1799
1800 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1801 let v: Vec<i64> = v.try_into_val(&env).unwrap();
1802
1803 v.get_unchecked(1);
1805 }
1806
1807 #[test]
1808 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1809 fn test_get_unchecked_panics_on_out_of_bounds() {
1810 let env = Env::default();
1811
1812 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1813 _ = v.get_unchecked(v.len()); }
1815
1816 #[test]
1817 fn test_try_get_unchecked() {
1818 let env = Env::default();
1819
1820 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1821
1822 assert_eq!(v.try_get_unchecked(3), Ok(5));
1824 assert_eq!(v.try_get_unchecked(0), Ok(0));
1825 assert_eq!(v.try_get_unchecked(1), Ok(3));
1826 assert_eq!(v.try_get_unchecked(2), Ok(5));
1827 assert_eq!(v.try_get_unchecked(5), Ok(9));
1828 assert_eq!(v.try_get_unchecked(4), Ok(7));
1829
1830 let v: Val = (1i64, 2i32).try_into_val(&env).unwrap();
1832 let v: Vec<i64> = v.try_into_val(&env).unwrap();
1833 assert_eq!(v.try_get_unchecked(0), Ok(1));
1834 assert_eq!(v.try_get_unchecked(1), Err(ConversionError.into()));
1835 }
1836
1837 #[test]
1838 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1839 fn test_try_get_unchecked_panics() {
1840 let env = Env::default();
1841
1842 let v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1843 _ = v.try_get_unchecked(v.len()); }
1845
1846 #[test]
1847 fn test_remove() {
1848 let env = Env::default();
1849 let mut v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1850
1851 assert_eq!(v.remove(0), Some(()));
1852 assert_eq!(v.remove(2), Some(()));
1853 assert_eq!(v.remove(3), Some(()));
1854
1855 assert_eq!(v, vec![&env, 3, 5, 7]);
1856 assert_eq!(v.len(), 3);
1857
1858 assert_eq!(v.remove(v.len()), None);
1860 assert_eq!(v.remove(v.len() + 1), None);
1861 assert_eq!(v.remove(u32::MAX), None);
1862
1863 assert_eq!(v.remove(0), Some(()));
1865 assert_eq!(v.remove(0), Some(()));
1866 assert_eq!(v.remove(0), Some(()));
1867 assert_eq!(v, vec![&env]);
1868 assert_eq!(v.len(), 0);
1869
1870 assert_eq!(v.remove(0), None);
1872 assert_eq!(v.remove(v.len()), None);
1873 assert_eq!(v.remove(v.len() + 1), None);
1874 assert_eq!(v.remove(u32::MAX), None);
1875 }
1876
1877 #[test]
1878 fn test_remove_unchecked() {
1879 let env = Env::default();
1880 let mut v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1881
1882 assert_eq!(v.remove_unchecked(0), ());
1883 assert_eq!(v.remove_unchecked(2), ());
1884 assert_eq!(v.remove_unchecked(3), ());
1885
1886 assert_eq!(v, vec![&env, 3, 5, 7]);
1887 assert_eq!(v.len(), 3);
1888
1889 assert_eq!(v.remove_unchecked(0), ());
1891 assert_eq!(v.remove_unchecked(0), ());
1892 assert_eq!(v.remove_unchecked(0), ());
1893 assert_eq!(v, vec![&env]);
1894 assert_eq!(v.len(), 0);
1895 }
1896
1897 #[test]
1898 #[should_panic(expected = "HostError: Error(Object, IndexBounds)")]
1899 fn test_remove_unchecked_panics() {
1900 let env = Env::default();
1901 let mut v: Vec<i64> = vec![&env, 0, 3, 5, 5, 7, 9];
1902 v.remove_unchecked(v.len())
1903 }
1904
1905 #[test]
1906 fn test_extend() {
1907 let env = Env::default();
1908 let mut v: Vec<i64> = vec![&env, 1, 2, 3];
1909
1910 let items = std::vec![4, 5, 6];
1912 v.extend(items);
1913 assert_eq!(v, vec![&env, 1, 2, 3, 4, 5, 6]);
1914 assert_eq!(v.len(), 6);
1915
1916 v.extend([7, 8, 9]);
1918 assert_eq!(v, vec![&env, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1919 assert_eq!(v.len(), 9);
1920
1921 let empty: std::vec::Vec<i64> = std::vec::Vec::new();
1923 v.extend(empty);
1924 assert_eq!(v, vec![&env, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
1925 assert_eq!(v.len(), 9);
1926 }
1927
1928 #[test]
1929 fn test_extend_empty_vec() {
1930 let env = Env::default();
1931 let mut v: Vec<i64> = vec![&env];
1932
1933 v.extend([1, 2, 3, 4, 5]);
1935 assert_eq!(v, vec![&env, 1, 2, 3, 4, 5]);
1936 assert_eq!(v.len(), 5);
1937 }
1938
1939 #[test]
1940 fn test_from_iter() {
1941 let env = Env::default();
1942
1943 let items = std::vec![1, 2, 3, 4, 5];
1945 let v = Vec::from_iter(&env, items);
1946 assert_eq!(v, vec![&env, 1, 2, 3, 4, 5]);
1947 assert_eq!(v.len(), 5);
1948
1949 let v2 = Vec::from_iter(&env, [10, 20, 30]);
1951 assert_eq!(v2, vec![&env, 10, 20, 30]);
1952 assert_eq!(v2.len(), 3);
1953
1954 let v3 = Vec::from_iter(&env, 1..=4);
1956 assert_eq!(v3, vec![&env, 1, 2, 3, 4]);
1957 assert_eq!(v3.len(), 4);
1958 }
1959
1960 #[test]
1961 fn test_from_iter_empty() {
1962 let env = Env::default();
1963
1964 let empty: std::vec::Vec<i64> = std::vec::Vec::new();
1966 let v = Vec::from_iter(&env, empty);
1967 assert_eq!(v, vec![&env]);
1968 assert_eq!(v.len(), 0);
1969
1970 let v2 = Vec::from_iter(&env, 1..1);
1972 assert_eq!(v2, vec![&env]);
1973 assert_eq!(v2.len(), 0);
1974 }
1975
1976 #[test]
1977 fn test_from_iter_different_types() {
1978 let env = Env::default();
1979
1980 let strings = std::vec!["hello".to_string(), "world".to_string(), "test".to_string()];
1982 let v = Vec::from_iter(&env, strings);
1983 assert_eq!(
1984 v,
1985 vec![
1986 &env,
1987 "hello".to_string(),
1988 "world".to_string(),
1989 "test".to_string()
1990 ]
1991 );
1992 assert_eq!(v.len(), 3);
1993
1994 let bools = [true, false, true, false];
1996 let v2 = Vec::from_iter(&env, bools.into_iter());
1997 assert_eq!(v2, vec![&env, true, false, true, false]);
1998 assert_eq!(v2.len(), 4);
1999 }
2000}