| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | // GNU Affero General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | package xslices_test | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	"math/rand" | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 	"net/url" | 
					
						
							|  |  |  | 	"slices" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-26 15:34:10 +02:00
										 |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/util/xslices" | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | func TestGrowJust(t *testing.T) { | 
					
						
							|  |  |  | 	for _, l := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 		for _, x := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 			s := make([]int, l, l+x) | 
					
						
							|  |  |  | 			for _, g := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 				s2 := xslices.GrowJust(s, g) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Slice length should not be different. | 
					
						
							|  |  |  | 				assert.Equal(t, len(s), len(s2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				switch { | 
					
						
							|  |  |  | 				// If slice already has capacity for | 
					
						
							|  |  |  | 				// 'g' then it should not be changed. | 
					
						
							|  |  |  | 				case cap(s) >= len(s)+g: | 
					
						
							|  |  |  | 					assert.Equal(t, cap(s), cap(s2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Else, returned slice should only | 
					
						
							|  |  |  | 				// have capacity for original length | 
					
						
							|  |  |  | 				// plus extra elements, NOTHING MORE. | 
					
						
							|  |  |  | 				default: | 
					
						
							|  |  |  | 					assert.Equal(t, cap(s2), len(s)+g) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAppendJust(t *testing.T) { | 
					
						
							|  |  |  | 	for _, l := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 		for _, x := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 			s := make([]int, l, l+x) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// Randomize slice. | 
					
						
							|  |  |  | 			for i := range s { | 
					
						
							|  |  |  | 				s[i] = rand.Int() | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for _, a := range []int{0, 2, 4, 8, 16, 32, 64} { | 
					
						
							|  |  |  | 				toAppend := make([]int, a) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Randomize appended vals. | 
					
						
							|  |  |  | 				for i := range toAppend { | 
					
						
							|  |  |  | 					toAppend[i] = rand.Int() | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				s2 := xslices.AppendJust(s, toAppend...) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Slice length should be as expected. | 
					
						
							|  |  |  | 				assert.Equal(t, len(s)+a, len(s2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Slice contents should be as expected. | 
					
						
							|  |  |  | 				assert.Equal(t, append(s, toAppend...), s2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				switch { | 
					
						
							|  |  |  | 				// If slice already has capacity for | 
					
						
							|  |  |  | 				// 'toAppend' then it should not change. | 
					
						
							|  |  |  | 				case cap(s) >= len(s)+a: | 
					
						
							|  |  |  | 					assert.Equal(t, cap(s), cap(s2)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Else, returned slice should only | 
					
						
							|  |  |  | 				// have capacity for original length | 
					
						
							|  |  |  | 				// plus extra elements, NOTHING MORE. | 
					
						
							|  |  |  | 				default: | 
					
						
							|  |  |  | 					assert.Equal(t, len(s)+a, cap(s2)) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestGather(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	out := xslices.Gather(nil, []*url.URL{ | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 		{Scheme: "https", Host: "google.com", Path: "/some-search"}, | 
					
						
							|  |  |  | 		{Scheme: "http", Host: "example.com", Path: "/robots.txt"}, | 
					
						
							|  |  |  | 	}, (*url.URL).String) | 
					
						
							|  |  |  | 	if !slices.Equal(out, []string{ | 
					
						
							|  |  |  | 		"https://google.com/some-search", | 
					
						
							|  |  |  | 		"http://example.com/robots.txt", | 
					
						
							|  |  |  | 	}) { | 
					
						
							|  |  |  | 		t.Fatal("unexpected gather output") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	out = xslices.Gather([]string{ | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 		"starting input string", | 
					
						
							|  |  |  | 		"another starting input", | 
					
						
							|  |  |  | 	}, []*url.URL{ | 
					
						
							|  |  |  | 		{Scheme: "https", Host: "google.com", Path: "/some-search"}, | 
					
						
							|  |  |  | 		{Scheme: "http", Host: "example.com", Path: "/robots.txt"}, | 
					
						
							|  |  |  | 	}, (*url.URL).String) | 
					
						
							|  |  |  | 	if !slices.Equal(out, []string{ | 
					
						
							|  |  |  | 		"starting input string", | 
					
						
							|  |  |  | 		"another starting input", | 
					
						
							|  |  |  | 		"https://google.com/some-search", | 
					
						
							|  |  |  | 		"http://example.com/robots.txt", | 
					
						
							|  |  |  | 	}) { | 
					
						
							|  |  |  | 		t.Fatal("unexpected gather output") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestGatherIf(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	out := xslices.GatherIf(nil, []string{ | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 		"hello world", | 
					
						
							|  |  |  | 		"not hello world", | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 	}, func(s string) (string, bool) { | 
					
						
							|  |  |  | 		return s, s == "hello world" | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if !slices.Equal(out, []string{ | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 	}) { | 
					
						
							|  |  |  | 		t.Fatal("unexpected gatherif output") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-11 15:45:19 +00:00
										 |  |  | 	out = xslices.GatherIf([]string{ | 
					
						
							| 
									
										
										
										
											2024-07-30 09:29:32 +00:00
										 |  |  | 		"starting input string", | 
					
						
							|  |  |  | 		"another starting input", | 
					
						
							|  |  |  | 	}, []string{ | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 		"not hello world", | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 	}, func(s string) (string, bool) { | 
					
						
							|  |  |  | 		return s, s == "hello world" | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if !slices.Equal(out, []string{ | 
					
						
							|  |  |  | 		"starting input string", | 
					
						
							|  |  |  | 		"another starting input", | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 		"hello world", | 
					
						
							|  |  |  | 	}) { | 
					
						
							|  |  |  | 		t.Fatal("unexpected gatherif output") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |