@@ -758,3 +758,70 @@ test "Float::until negative step" {
758758 let result = 10.0.until(0.0, step=-2.0).collect()
759759 inspect!(result, content="[10, 8, 6, 4, 2]")
760760}
761+
762+ ///|
763+ test " group_by with consecutive identical elements " {
764+ let iter = [1, 1, 2, 2, 3, 3].iter()
765+ let grouped = iter.group_by(fn(x) { x })
766+ assert_eq!(grouped.get(1), Some ([1, 1]))
767+ assert_eq!(grouped.get(2), Some ([2, 2]))
768+ assert_eq!(grouped.get(3), Some ([3, 3]))
769+ }
770+
771+ ///|
772+ test " group_by with non-consecutive identical elements " {
773+ let iter = [1, 2, 1, 3, 2, 1].iter()
774+ let grouped = iter.group_by(fn(x) { x })
775+ assert_eq!(grouped.get(1), Some ([1, 1, 1]))
776+ assert_eq!(grouped.get(2), Some ([2, 2]))
777+ assert_eq!(grouped.get(3), Some ([3]))
778+ }
779+
780+ ///|
781+ test " group_by with empty input " {
782+ let iter : Iter [Int ] = Iter ::empty()
783+ let grouped = iter.group_by(fn(x) { x })
784+ assert_eq!(grouped.size(), 0)
785+ }
786+
787+ ///|
788+ test " group_by with single element input " {
789+ let iter = [42].iter()
790+ let grouped = iter.group_by(fn(x) { x })
791+ assert_eq!(grouped.get(42), Some ([42]))
792+ }
793+
794+ ///|
795+ test " group_by with custom key function " {
796+ let iter = [1, 2, 3, 4].iter()
797+ let grouped = iter.group_by(fn(x) { x % 2 })
798+ assert_eq!(grouped.get(0), Some ([2, 4]))
799+ assert_eq!(grouped.get(1), Some ([1, 3]))
800+ }
801+
802+ ///|
803+ test " group_by with strings " {
804+ let iter = ["apple", "avocado", "banana", "cherry", "blueberry"].iter()
805+ let grouped = iter.group_by(fn(s) { s[0] })
806+ assert_eq!(grouped.get('a'), Some (["apple", "avocado"]))
807+ assert_eq!(grouped.get('b'), Some (["banana", "blueberry"]))
808+ assert_eq!(grouped.get('c'), Some (["cherry"]))
809+ }
810+
811+ ///|
812+ test " group_by with complex objects " {
813+ struct Person {
814+ name : String
815+ age : Int
816+ }
817+ let people = [
818+ Person ::{ name: "Alice ", age: 25 },
819+ Person ::{ name: "Bob ", age: 25 },
820+ Person ::{ name: "Charlie ", age: 30 },
821+ Person ::{ name: "Dave ", age: 35 },
822+ Person ::{ name: "Eve ", age: 30 },
823+ ].iter()
824+ let grouped = people.group_by(fn(p) { p.age })
825+ let groups = grouped.values().map(fn(a) { a.map(fn(p) { p.name }) }).collect()
826+ assert_eq!(groups, [["Alice ", "Bob "], ["Charlie ", "Eve "], ["Dave "]])
827+ }
0 commit comments