1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 21:02:27 +08:00

Compare commits

...

28 Commits

Author SHA1 Message Date
dudaodong
584aabdf62 release v2.2.3 2023-07-03 14:09:04 +08:00
dudaodong
1b754a6264 doc: update link in readme 2023-07-03 11:57:50 +08:00
dudaodong
06a558d797 doc: update link in readme 2023-07-03 11:21:49 +08:00
dudaodong
423779d3ff doc: update link in readme 2023-07-03 11:14:55 +08:00
dudaodong
78c17a9e7b doc: update link in readme 2023-07-03 10:52:26 +08:00
dudaodong
529b9317d0 doc: update link in readme 2023-07-03 10:48:04 +08:00
dudaodong
dc838f645b doc: update link in readme 2023-07-03 10:43:05 +08:00
dudaodong
7f559c4940 doc: update link in readme 2023-07-03 10:42:22 +08:00
dudaodong
acb08dfd90 doc: update link in readme 2023-07-03 10:40:50 +08:00
dudaodong
ffe46fd06d update readme file 2023-07-02 22:31:17 +08:00
dudaodong
b419e46b9b doc: add package index 2023-07-02 22:12:47 +08:00
dudaodong
8fbcdfd515 doc: add pointer and tuple package to readme file 2023-07-02 21:06:10 +08:00
dudaodong
f03f48210c doc: update system package 2023-06-30 15:12:18 +08:00
dudaodong
742944e2f0 doc: add doc for tuple package 2023-06-30 15:11:26 +08:00
dudaodong
c0b491ad78 doc: add example for tuple package 2023-06-30 11:20:46 +08:00
dudaodong
e9abae2a92 doc: add doc for pointer package 2023-06-30 10:31:22 +08:00
dudaodong
8229de2f10 test: add parallel running for all unit test functions 2023-06-30 10:18:45 +08:00
dudaodong
ab364744b6 test: add parallel running for all unit test functions 2023-06-29 14:49:28 +08:00
dudaodong
17ff84fa1f test: add test for Tuple Zip and Unzip 2023-06-29 11:34:43 +08:00
dudaodong
bf50baa07d feat: add GetTodayStartTime and GetTodayEndTime 2023-06-29 11:03:28 +08:00
dudaodong
7d56da8108 feat: add Md5Byte 2023-06-29 10:33:29 +08:00
dudaodong
16c2df711b feat: add unzip for tuple 2023-06-28 20:06:02 +08:00
dudaodong
015f8c3f5c feat: add zip 2023-06-28 19:41:46 +08:00
dudaodong
ba25701d89 feat: add zip 2023-06-28 17:52:12 +08:00
dudaodong
a0cb4bb266 doc: add example for tuple package 2023-06-28 16:25:43 +08:00
dudaodong
d6ba7497f9 feat: add Tuple package 2023-06-28 15:58:41 +08:00
dudaodong
7da931e0a0 feat: add Abs 2023-06-27 10:24:35 +08:00
dudaodong
8f49078eb3 doc: add go playground demo 2023-06-20 14:04:18 +08:00
78 changed files with 5557 additions and 207 deletions

185
README.md
View File

@@ -4,7 +4,7 @@
<br/>
![Go version](https://img.shields.io/badge/go-%3E%3Dv1.18-9cf)
[![Release](https://img.shields.io/badge/release-2.2.2-green.svg)](https://github.com/duke-git/lancet/releases)
[![Release](https://img.shields.io/badge/release-2.2.3-green.svg)](https://github.com/duke-git/lancet/releases)
[![GoDoc](https://godoc.org/github.com/duke-git/lancet/v2?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet/v2)
[![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet/v2)](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
[![test](https://github.com/duke-git/lancet/actions/workflows/codecov.yml/badge.svg?branch=main&event=push)](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
@@ -24,7 +24,7 @@ English | [简体中文](./README_zh-CN.md)
## Feature
- 👏 Comprehensive, efficient and reusable.
- 💪 500+ go util functions, support string, slice, datetime, net, crypt...
- 💪 600+ go util functions, support string, slice, datetime, net, crypt...
- 💅 Only depends on two kinds of libraries: go standard library and golang.org/x.
- 🌍 Unit test for every exported function.
@@ -73,7 +73,35 @@ func main() {
## Documentation
### 1. Algorithm package implements some basic algorithm. eg. sort, search.
### <span id="index">Index<span>
- [Algorithm](#Algorithm)
- [Compare](#Compare)
- [Concurrency](#Concurrency)
- [Condition](#Condition)
- [Convertor](#Convertor)
- [Cryptor](#Cryptor)
- [Datetime](#Datetime)
- [Datastructure](#Datastructure)
- [Fileutil](#Fileutil)
- [Formatter](#Formatter)
- [Function](#Function)
- [Maputil](#Maputil)
- [Mathutil](#Mathutil)
- [Netutil](#Netutil)
- [Pointer](#Pointer)
- [Random](#Random)
- [Retry](#Retry)
- [Slice](#Slice)
- [Stream](#Stream)
- [Structs](#Structs)
- [Strutil](#Strutil)
- [System](#System)
- [Tuple](#Tuple)
- [Validator](#Validator)
- [Xerror](#Xerror)
<h3 id="Algorithm"> 1. Algorithm package implements some basic algorithm. eg. sort, search. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span> </h3>
```go
import "github.com/duke-git/lancet/v2/algorithm"
@@ -118,7 +146,7 @@ import "github.com/duke-git/lancet/v2/algorithm"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/algorithm.md#LRUCache)]
[[play](https://go.dev/play/p/-EZjgOURufP)]
### 2. Compare package provides a lightweight comparison function on any type.
<h3 id="Compare"> 2. Compare package provides a lightweight comparison function on any type. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span> </h3>
```go
import "github.com/duke-git/lancet/v2/compare"
@@ -145,7 +173,7 @@ import "github.com/duke-git/lancet/v2/compare"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/compare.md#GreaterOrEqual)]
[[play](https://go.dev/play/p/vx8mP0U8DFk)]
### 3. Concurrency package contain some functions to support concurrent programming. eg, goroutine, channel, async.
<h3 id="Concurrency"> 3. Concurrency package contain some functions to support concurrent programming. eg, goroutine, channel, async. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span> </h3>
```go
import "github.com/duke-git/lancet/v2/concurrency"
@@ -184,7 +212,7 @@ import "github.com/duke-git/lancet/v2/concurrency"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/concurrency.md#Tee)]
[[play](https://go.dev/play/p/3TQPKnCirrP)]
### 4. Condition package contains some functions for conditional judgment. eg. And, Or, TernaryOperator...
<h3 id="Condition"> 4. Condition package contains some functions for conditional judgment. eg. And, Or, TernaryOperator...&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span> </h3>
```go
import "github.com/duke-git/lancet/v2/condition"
@@ -217,7 +245,7 @@ import "github.com/duke-git/lancet/v2/condition"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/condition.md#TernaryOperator)]
[[play](https://go.dev/play/p/ElllPZY0guT)]
### 5. Convertor package contains some functions for data convertion.
<h3 id="Convertor"> 5. Convertor package contains some functions for data convertion. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span> </h3>
```go
import "github.com/duke-git/lancet/v2/convertor"
@@ -284,10 +312,12 @@ import "github.com/duke-git/lancet/v2/convertor"
[[play](https://go.dev/play/p/syqw0-WG7Xd)]
- **<big>Utf8ToGbk</big>** : converts utf8 encoding data to GBK encoding data
[[doc](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#Utf8ToGbk)]
[[play](https://go.dev/play/p/9FlIaFLArIL)]
- **<big>GbkToUtf8</big>** : converts GBK encoding data to utf8 encoding data.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/convertor.md#GbkToUtf8)]
[[play](https://go.dev/play/p/OphmHCN_9u8)]
### 6. Cryptor package is for data encryption and decryption.
<h3 id="Cryptor"> 6. Cryptor package is for data encryption and decryption.</span> &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/cryptor"
@@ -391,7 +421,7 @@ import "github.com/duke-git/lancet/v2/cryptor"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/cryptor.md#RsaDecrypt)]
[[play](https://go.dev/play/p/uef0q1fz53I)]
### 7. Datetime package supports date and time format and compare.
<h3 id="Datetime"> 7. Datetime package supports date and time format and compare. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/datetime"
@@ -505,8 +535,7 @@ import "github.com/duke-git/lancet/v2/datetime"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datetime.md#IsWeekend)]
[[play](https://go.dev/play/p/cupRM5aZOIY)]
### 8. Datastructure package constains some common data structure. eg. list, linklist, stack, queue, set, tree, graph.
<h3 id="Datastructure"> 8. Datastructure package constains some common data structure. eg. list, linklist, stack, queue, set, tree, graph. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import list "github.com/duke-git/lancet/v2/datastructure/list"
@@ -538,7 +567,7 @@ import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
- **<big>Hashmap</big>** : hash map structure.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datastructure/hashmap.md)]
### 9. Fileutil package implements some basic functions for file operations.
<h3 id="Fileutil"> 9. Fileutil package implements some basic functions for file operations. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/fileutil"
@@ -613,6 +642,7 @@ import "github.com/duke-git/lancet/v2/fileutil"
[[play](https://go.dev/play/p/OExTkhGEd3_u)]
- **<big>WriteCsvFile</big>** : write content to target csv file.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil.md#WriteCsvFile)]
[[play](https://go.dev/play/p/dAXm58Q5U1o)]
- **<big>WriteBytesToFile</big>** : write bytes to target file.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil.md#WriteBytesToFile)]
[[play](https://go.dev/play/p/s7QlDxMj3P8)]
@@ -620,8 +650,7 @@ import "github.com/duke-git/lancet/v2/fileutil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil.md#WriteStringToFile)]
[[play](https://go.dev/play/p/GhLS6d8lH_g)]
### 10. Formatter contains some functions for data formatting.
<h3 id="Formatter"> 10. Formatter contains some functions for data formatting. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/formatter"
@@ -651,7 +680,7 @@ import "github.com/duke-git/lancet/v2/formatter"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/formatter.md#ParseBinaryBytes)]
[[play](https://go.dev/play/p/69v1tTT62x8)]
### 11. Function package can control the flow of function execution and support part of functional programming
<h3 id="Function"> 11. Function package can control the flow of function execution and support part of functional programming.&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/function"
@@ -687,7 +716,7 @@ import "github.com/duke-git/lancet/v2/function"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/function.md#Watcher)]
[[play](https://go.dev/play/p/l2yrOpCLd1I)]
### 12. Maputil package includes some functions to manipulate map.
<h3 id="Maputil"> 12. Maputil package includes some functions to manipulate map.&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/maputil"
@@ -759,7 +788,7 @@ import "github.com/duke-git/lancet/v2/maputil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/maputil.md#IsDisjoint)]
[[play](https://go.dev/play/p/N9qgYg_Ho6f)]
### 13. Mathutil package implements some functions for math calculation.
<h3 id="Mathutil"> 13. Mathutil package implements some functions for math calculation. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</span></h3>
```go
import "github.com/duke-git/lancet/v2/mathutil"
@@ -835,10 +864,12 @@ import "github.com/duke-git/lancet/v2/mathutil"
[[play](https://go.dev/play/p/TWMQlMywDsP)]
- **<big>Log</big>** : returns the logarithm of base n.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/mathutil.md#Log)]
[[play](https://go.dev/play/p/_d4bi8oyhat)]
- **<big>Sum</big>** : return sum of passed numbers.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/mathutil.md#Sum)]
[[play](https://go.dev/play/p/1To2ImAMJA7)]
### 14. Netutil package contains functions to get net information and send http request.
<h3 id="Netutil"> 14. Netutil package contains functions to get net information and send http request. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/netutil"
@@ -911,7 +942,25 @@ import "github.com/duke-git/lancet/v2/netutil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsTelnetConnected)]
[[play](https://go.dev/play/p/yiLCGtQv_ZG)]
### 15. Random package implements some basic functions to generate random int and string.
<h3 id="Pointer"> 15. Pointer package contains some util functions to operate go pointer. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/pointer"
```
#### Function list:
- **<big>ExtractPointer</big>** : return the underlying value by the given interface type.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer.md#ExtractPointer)]
[[play](https://go.dev/play/p/D7HFjeWU2ZP)]
- **<big>Of</big>** : return a pointer to the value `v`.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer.md#Of)]
[[play](https://go.dev/play/p/HFd70x4DrMj)]
- **<big>Unwrap</big>** : return the value from the pointer.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer.md#Unwrap)]
[[play](https://go.dev/play/p/cgeu3g7cjWb)]
<h3 id="Random"> 16. Random package implements some basic functions to generate random int and string. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/random"
@@ -945,8 +994,9 @@ import "github.com/duke-git/lancet/v2/random"
[[play](https://go.dev/play/p/_Z9SFmr28ft)]
- **<big>RandUniqueIntSlice</big>** : generate a slice of random int of length n that do not repeat.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/random.md#RandUniqueIntSlice)]
[[play](https://go.dev/play/p/uBkRSOz73Ec)]
### 16. Retry package is for executing a function repeatedly until it was successful or canceled by the context.
<h3 id="Retry"> 17. Retry package is for executing a function repeatedly until it was successful or canceled by the context. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/retry"
@@ -970,7 +1020,7 @@ import "github.com/duke-git/lancet/v2/retry"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/retry.md#RetryTimes)]
[[play](https://go.dev/play/p/ssfVeU2SwLO)]
### 17. Slice contains some functions to manipulate slice.
<h3 id="Slice"> 18. Slice contains some functions to manipulate slice. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/slice"
@@ -1183,7 +1233,7 @@ import "github.com/duke-git/lancet/v2/slice"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/slice.md#KeyBy)]
[[play](https://go.dev/play/p/uXod2LWD1Kg)]
### 18. Stream package implements a sequence of elements supporting sequential and operations. this package is an experiment to explore if stream in go can work as the way java does. its function is very limited.
<h3 id="Stream"> 19. Stream package implements a sequence of elements supporting sequential and operations. this package is an experiment to explore if stream in go can work as the way java does. its function is very limited. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/stream"
@@ -1270,7 +1320,7 @@ import "github.com/duke-git/lancet/v2/stream"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/stream.md#ToSlice)]
[[play](https://go.dev/play/p/jI6_iZZuVFE)]
### 19. Structs package provides several high level functions to manipulate struct, tag, and field.
<h3 id="Structs"> 20. Structs package provides several high level functions to manipulate struct, tag, and field. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/structs"
@@ -1303,7 +1353,7 @@ import "github.com/duke-git/lancet/v2/structs"
- **<big>IsSlice</big>** : check if the field is a slice
[[doc](https://github.com/duke-git/lancet/blob/main/docs/structs/field.md#IsSlice)]
### 20. Strutil package contains some functions to manipulate string.
<h3 id="Strutil"> 21. Strutil package contains some functions to manipulate string. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/strutil"
@@ -1421,7 +1471,7 @@ import "github.com/duke-git/lancet/v2/strutil"
- **<big>RemoveWhiteSpace</big>** : remove whitespace characters from a string.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/strutil.md#RemoveWhiteSpace)]
### 21. System package contain some functions about os, runtime, shell command.
<h3 id="System"> 22. System package contain some functions about os, runtime, shell command. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/system"
@@ -1457,7 +1507,88 @@ import "github.com/duke-git/lancet/v2/system"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/system.md#GetOsBits)]
[[play](https://go.dev/play/p/ml-_XH3gJbW)]
### 22. Validator package contains some functions for data validation.
<h3 id="Tuple"> 23. Tuple package implements tuple data type and some operations on it. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/tuple"
```
#### Function list:
- **<big>Tuple2</big>** : represents a 2 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple2)]
- **<big>Tuple2_Unbox</big>** : returns values in Tuple2.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple2_Unbox)]
- **<big>Zip2</big>** : create a slice of Tuple2, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip2)]
- **<big>Unzip2</big>** : create a group of slice from a slice of Tuple2.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip2)]
- **<big>Tuple3</big>** : represents a 3 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple3)]
- **<big>Tuple3_Unbox</big>** : returns values in Tuple3.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple3_Unbox)]
- **<big>Zip3</big>** : create a slice of Tuple3, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip3)]
- **<big>Unzip3</big>** : create a group of slice from a slice of Tuple3.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip3)]
- **<big>Tuple4</big>** : represents a 4 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple4)]
- **<big>Tuple4_Unbox</big>** : returns values in Tuple4.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple4_Unbox)]
- **<big>Zip4</big>** : create a slice of Tuple4, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip4)]
- **<big>Unzip4</big>** : create a group of slice from a slice of Tuple4.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip4)]
- **<big>Tuple5</big>** : represents a 5 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple5)]
- **<big>Tuple5_Unbox</big>** : returns values in Tuple4.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple5_Unbox)]
- **<big>Zip5</big>** : create a slice of Tuple5, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip5)]
- **<big>Unzip5</big>** : create a group of slice from a slice of Tuple5.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip5)]
- **<big>Tuple6</big>** : represents a 6 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple6)]
- **<big>Tuple6_Unbox</big>** : returns values in Tuple6.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple6_Unbox)]
- **<big>Zip6</big>** : create a slice of Tuple6, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip6)]
- **<big>Unzip6</big>** : create a group of slice from a slice of Tuple6.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip6)]
- **<big>Tuple7</big>** : represents a 7 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple7)]
- **<big>Tuple7_Unbox</big>** : returns values in Tuple7.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple7_Unbox)]
- **<big>Zip7</big>** : create a slice of Tuple7, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip7)]
- **<big>Unzip7</big>** : create a group of slice from a slice of Tuple7.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip7)]
- **<big>Tuple8</big>** : represents a 8 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple8)]
- **<big>Tuple8_Unbox</big>** : returns values in Tuple8.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple8_Unbox)]
- **<big>Zip8</big>** : create a slice of Tuple8, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip8)]
- **<big>Unzip8</big>** : create a group of slice from a slice of Tuple8.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip8)]
- **<big>Tuple9</big>** : represents a 9 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple9)]
- **<big>Tuple9_Unbox</big>** : returns values in Tuple9.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple9_Unbox)]
- **<big>Zip9</big>** : create a slice of Tuple9, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip9)]
- **<big>Unzip9</big>** : create a group of slice from a slice of Tuple9.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip9)]
- **<big>Tuple10</big>** : represents a 10 elemnets tuple.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple10)]
- **<big>Tuple10_Unbox</big>** : returns values in Tuple10.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Tuple10_Unbox)]
- **<big>Zip10</big>** : create a slice of Tuple10, whose elements are correspond to the given slice elements.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Zip10)]
- **<big>Unzip10</big>** : create a group of slice from a slice of Tuple10.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple.md#Unzip10)]
<h3 id="Validator"> 24. Validator package contains some functions for data validation. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/validator"
@@ -1565,7 +1696,7 @@ import "github.com/duke-git/lancet/v2/validator"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/validator.md#IsPrintable)]
[[play](https://go.dev/play/p/Pe1FE2gdtTP)]
### 23. xerror package implements helpers for errors.
<h3 id="Xerror"> 25. Xerror package implements helpers for errors. &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">index</a></h3>
```go
import "github.com/duke-git/lancet/v2/xerror"

View File

@@ -4,7 +4,7 @@
<br/>
![Go version](https://img.shields.io/badge/go-%3E%3Dv1.18-9cf)
[![Release](https://img.shields.io/badge/release-2.2.2-green.svg)](https://github.com/duke-git/lancet/releases)
[![Release](https://img.shields.io/badge/release-2.2.3-green.svg)](https://github.com/duke-git/lancet/releases)
[![GoDoc](https://godoc.org/github.com/duke-git/lancet/v2?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet/v2)
[![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet/v2)](https://goreportcard.com/report/github.com/duke-git/lancet/v2)
[![test](https://github.com/duke-git/lancet/actions/workflows/codecov.yml/badge.svg?branch=main&event=push)](https://github.com/duke-git/lancet/actions/workflows/codecov.yml)
@@ -23,7 +23,7 @@
## 特性
- 👏 全面、高效、可复用。
- 💪 500+常用 go 工具函数,支持 string、slice、datetime、net、crypt...
- 💪 600+常用 go 工具函数,支持 string、slice、datetime、net、crypt...
- 💅 只依赖 go 标准库和 golang.org/x。
- 🌍 所有导出函数单元测试覆盖率 100%。
@@ -72,13 +72,41 @@ func main() {
## 文档
### 1. algorithm 包实现一些基本查找和排序算法。
### <span id="index">目录<span>
- [Algorithm](#Algorithm)
- [Compare](#Compare)
- [Concurrency](#Concurrency)
- [Condition](#Condition)
- [Convertor](#Convertor)
- [Cryptor](#Cryptor)
- [Datetime](#Datetime)
- [Datastructure](#Datastructure)
- [Fileutil](#Fileutil)
- [Formatter](#Formatter)
- [Function](#Function)
- [Maputil](#Maputil)
- [Mathutil](#Mathutil)
- [Netutil](#Netutil)
- [Pointer](#Pointer)
- [Random](#Random)
- [Retry](#Retry)
- [Slice](#Slice)
- [Stream](#Stream)
- [Structs](#Structs)
- [Strutil](#Strutil)
- [System](#System)
- [Tuple](#Tuple)
- [Validator](#Validator)
- [Xerror](#Xerror)
<h3 id="Algorithm"> 1. algorithm 包实现一些基本查找和排序算法。 &nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/algorithm"
```
#### Function list:
#### 函数列表:
- **<big>BubbleSort</big>** : 使用冒泡排序算法对切片进行排序。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/algorithm_zh-CN.md#BubbleSort)]
@@ -117,13 +145,13 @@ import "github.com/duke-git/lancet/v2/algorithm"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/algorithm_zh-CN.md#LRUCache)]
[[play](https://go.dev/play/p/-EZjgOURufP)]
### 2. compare 包提供几个轻量级的类型比较函数。
<h3 id="Compare"> 2. compare 包提供几个轻量级的类型比较函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/compare"
```
#### Function list:
#### 函数列表:
- **<big>Equal</big>** : 检查两个值是否相等(检查类型和值)。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/compare_zh-CN.md#Equal)]
@@ -144,13 +172,13 @@ import "github.com/duke-git/lancet/v2/compare"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/compare_zh-CN.md#GreaterOrEqual)]
[[play](https://go.dev/play/p/vx8mP0U8DFk)]
### 3. concurrency 包含一些支持并发编程的功能。例如goroutine, channel, async 等。
<h3 id="Concurrency"> 3. concurrency 包含一些支持并发编程的功能。例如goroutine, channel, async 等。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/concurrency"
```
#### Function list:
#### 函数列表:
- **<big>NewChannel</big>** : 返回一个 Channel 指针实例。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/concurrency_zh-CN.md#NewChannel)]
@@ -183,13 +211,13 @@ import "github.com/duke-git/lancet/v2/concurrency"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/concurrency_zh-CN.md#Tee)]
[[play](https://go.dev/play/p/3TQPKnCirrP)]
### 4. condition 包含一些用于条件判断的函数。
<h3 id="Condition"> 4. condition 包含一些用于条件判断的函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/condition"
```
#### Function list:
#### 函数列表:
- **<big>Bool</big>** : 返回传入参数的 bool 值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/condition_zh-CN.md#Bool)]
@@ -216,7 +244,7 @@ import "github.com/duke-git/lancet/v2/condition"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/condition_zh-CN.md#TernaryOperator)]
[[play](https://go.dev/play/p/ElllPZY0guT)]
### 5. convertor 转换器包支持一些常见的数据类型转换。
<h3 id="Convertor"> 5. convertor 转换器包支持一些常见的数据类型转换。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/convertor"
@@ -283,10 +311,12 @@ import "github.com/duke-git/lancet/v2/convertor"
[[play](https://go.dev/play/p/syqw0-WG7Xd)]
- **<big>Utf8ToGbk</big>** : utf8 编码转 GBK 编码。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#Utf8ToGbk)]
[[play](https://go.dev/play/p/9FlIaFLArIL)]
- **<big>GbkToUtf8</big>** : GBK 编码转 utf8 编码。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/convertor_zh-CN.md#GbkToUtf8)]
[[play](https://go.dev/play/p/OphmHCN_9u8)]
### 6. cryptor 加密包支持数据加密和解密,获取 md5hash 值。支持 base64, md5, hmac, aes, des, rsa。
<h3 id="Cryptor"> 6. cryptor 加密包支持数据加密和解密,获取 md5hash 值。支持 base64, md5, hmac, aes, des, rsa。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/cryptor"
@@ -390,7 +420,7 @@ import "github.com/duke-git/lancet/v2/cryptor"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/cryptor_zh-CN.md#RsaDecrypt)]
[[play](https://go.dev/play/p/uef0q1fz53I)]
### 7. datetime 日期时间处理包,格式化日期,比较日期。
<h3 id="Datetime"> 7. datetime 日期时间处理包,格式化日期,比较日期。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/datetime"
@@ -507,7 +537,7 @@ import "github.com/duke-git/lancet/v2/datetime"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datetime_zh-CN.md#IsWeekend)]
[[play](https://go.dev/play/p/cupRM5aZOIY)]
### 8. datastructure 包含一些普通的数据结构实现。例如list, linklist, stack, queue, set, tree, graph.
<h3 id="Datastructure"> 8. datastructure 包含一些普通的数据结构实现。例如list, linklist, stack, queue, set, tree, graph。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import list "github.com/duke-git/lancet/v2/datastructure/list"
@@ -520,7 +550,7 @@ import heap "github.com/duke-git/lancet/v2/datastructure/heap"
import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
```
#### Function list:
#### 函数列表:
- **<big>List</big>** : 线性表结构, 用切片实现。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datastructure/list_zh-CN.md)]
@@ -539,7 +569,7 @@ import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
- **<big>Hashmap</big>** : 哈希映射。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datastructure/hashmap_zh-CN.md)]
### 9. fileutil 包含文件基本操作。
<h3 id="Fileutil"> 9. fileutil 包含文件基本操作。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/fileutil"
@@ -614,6 +644,7 @@ import "github.com/duke-git/lancet/v2/fileutil"
[[play](https://go.dev/play/p/OExTkhGEd3_u)]
- **<big>WriteCsvFile</big>** : 向 csv 文件写入内容。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil_zh-CN.md#WriteCsvFile)]
[[play](https://go.dev/play/p/dAXm58Q5U1o)]
- **<big>WriteBytesToFile</big>** : 将 bytes 写入文件。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil_zh-CN.md#WriteBytesToFile)]
[[play](https://go.dev/play/p/s7QlDxMj3P8)]
@@ -621,7 +652,7 @@ import "github.com/duke-git/lancet/v2/fileutil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/fileutil_zh-CN.md#WriteStringToFile)]
[[play](https://go.dev/play/p/GhLS6d8lH_g)]
### 10. formatter 格式化器包含一些数据格式化处理方法。
<h3 id="Formatter"> 10. formatter 格式化器包含一些数据格式化处理方法。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/formatter"
@@ -651,7 +682,7 @@ import "github.com/duke-git/lancet/v2/formatter"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/formatter_zh-CN.md#ParseBinaryBytes)]
[[play](https://go.dev/play/p/69v1tTT62x8)]
### 11. function 函数包控制函数执行流程,包含部分函数式编程。
<h3 id="Function"> 11. function 函数包控制函数执行流程,包含部分函数式编程。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/function"
@@ -687,7 +718,7 @@ import "github.com/duke-git/lancet/v2/function"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/function_zh-CN.md#Watcher)]
[[play](https://go.dev/play/p/l2yrOpCLd1I)]
### 12. maputil 包括一些操作 map 的函数.
<h3 id="Maputil"> 12. maputil 包括一些操作 map 的函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/maputil"
@@ -759,13 +790,13 @@ import "github.com/duke-git/lancet/v2/maputil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/maputil_zh-CN.md#IsDisjoint)]
[[play](https://go.dev/play/p/N9qgYg_Ho6f)]
### 13. mathutil 包实现了一些数学计算的函数。
<h3 id="Mathutil"> 13. mathutil 包实现了一些数学计算的函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/mathutil"
```
#### Function list:
#### 函数列表:
- **<big>Average</big>** :计算平均数,可能需要对结果调用 RoundToFloat 方法四舍五入。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/mathutil_zh-CN.md#Average)]
@@ -835,10 +866,12 @@ import "github.com/duke-git/lancet/v2/mathutil"
[[play](https://go.dev/play/p/TWMQlMywDsP)]
- **<big>Log</big>** : 计算以 base 为底 n 的对数。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/mathutil_zh-CN.md#Log)]
[[play](https://go.dev/play/p/_d4bi8oyhat)]
- **<big>Sum</big>** : 求传入参数之和。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/mathutil_zh-CN.md#Sum)]
[[play](https://go.dev/play/p/1To2ImAMJA7)]
### 14. netutil 网络包支持获取 ip 地址,发送 http 请求。
<h3 id="Netutil"> 14. netutil 网络包支持获取 ip 地址,发送 http 请求。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/netutil"
@@ -911,7 +944,25 @@ import "github.com/duke-git/lancet/v2/netutil"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsTelnetConnected)]
[[play](https://go.dev/play/p/yiLCGtQv_ZG)]
### 15. random 随机数生成器包,可以生成随机[]bytes, int, string。
<h3 id="Pointer"> 15. pointer 包支持一些指针类型的操作。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/pointer"
```
#### 函数列表:
- **<big>ExtractPointer</big>** : 返回传入 interface 的底层值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer_zh-CN.md#ExtractPointer)]
[[play](https://go.dev/play/p/D7HFjeWU2ZP)]
- **<big>Of</big>** : 返回传入参数的指针值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer_zh-CN.md#Of)]
[[play](https://go.dev/play/p/HFd70x4DrMj)]
- **<big>Unwrap</big>** : 返回传入指针指向的值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/pointer_zh-CN.md#Unwrap)]
[[play](https://go.dev/play/p/cgeu3g7cjWb)]
<h3 id="Random"> 16. random 随机数生成器包,可以生成随机[]bytes, int, string。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/random"
@@ -943,10 +994,11 @@ import "github.com/duke-git/lancet/v2/random"
- **<big>UUIdV4</big>** : 生成 UUID v4 字符串。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/random_zh-CN.md#UUIdV4)]
[[play](https://go.dev/play/p/_Z9SFmr28ft)]
- **<big>RandUniqueIntSlice</big>** : 生成一个不重复的长度为n的随机int切片。
- **<big>RandUniqueIntSlice</big>** : 生成一个不重复的长度为 n 的随机 int 切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/random_zh-CN.md#RandUniqueIntSlice)]
[[play](https://go.dev/play/p/uBkRSOz73Ec)]
### 16. retry 重试执行函数直到函数运行成功或被 context cancel。
<h3 id="Retry"> 17. retry 重试执行函数直到函数运行成功或被 context cancel。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/retry"
@@ -970,7 +1022,7 @@ import "github.com/duke-git/lancet/v2/retry"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/retry_zh-CN.md#RetryTimes)]
[[play](https://go.dev/play/p/ssfVeU2SwLO)]
### 17. slice 包含操作切片的方法集合。
<h3 id="Slice"> 18. slice 包含操作切片的方法集合。</span>&nbsp; &nbsp; &nbsp; &nbsp; [回到目录](#index)
```go
import "github.com/duke-git/lancet/v2/slice"
@@ -1183,13 +1235,13 @@ import "github.com/duke-git/lancet/v2/slice"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/slice_zh-CN.md#KeyBy)]
[[play](https://go.dev/play/p/uXod2LWD1Kg)]
### 18. Stream 流,该包仅验证简单的 stream 实现,功能有限。
<h3 id="Stream"> 19. stream 流,该包仅验证简单的 stream 实现,功能有限。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/stream"
```
#### Function list:
#### 函数列表:
- **<big>Of</big>** : 创建元素为指定值的 stream。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/stream_zh-CN.md#Of)]
@@ -1270,13 +1322,13 @@ import "github.com/duke-git/lancet/v2/stream"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/stream_zh-CN.md#ToSlice)]
[[play](https://go.dev/play/p/jI6_iZZuVFE)]
### 19. structs 提供操作 struct, tag, field 的相关函数。
<h3 id="Structs"> 20. structs 提供操作 struct, tag, field 的相关函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/structs"
```
#### Function list:
#### 函数列表:
- **<big>New</big>** : `Struct`结构体的构造函数。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/structs/struct_zh-CN.md#New)]
@@ -1305,7 +1357,7 @@ import "github.com/duke-git/lancet/v2/structs"
- **<big>IsSlice</big>** : 判断属性是否是切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/structs/field_zh-CN.md#IsSlice)]
### 20. strutil 包含字符串处理的相关函数。
<h3 id="Strutil"> 21. strutil 包含字符串处理的相关函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/strutil"
@@ -1424,7 +1476,7 @@ import "github.com/duke-git/lancet/v2/strutil"
- **<big>RemoveWhiteSpace</big>** : 删除字符串中的空格。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/strutil_zh-CN.md#RemoveWhiteSpace)]
### 21. system 包含 os, runtime, shell command 的相关函数。
<h3 id="System"> 22. system 包含 os, runtime, shell command 的相关函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/system"
@@ -1460,7 +1512,88 @@ import "github.com/duke-git/lancet/v2/system"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/system_zh-CN#GetOsBits)]
[[play](https://go.dev/play/p/ml-_XH3gJbW)]
### 22. validator 验证器包,包含常用字符串格式验证函数。
<h3 id="Tuple"> 23. Tuple 包实现一个元组数据类型。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/tuple"
```
#### 函数列表:
- **<big>Tuple2</big>** : 2 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple2)]
- **<big>Tuple2_Unbox</big>** : 返回 2 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple2_Unbox)]
- **<big>Zip2</big>** : 创建一个 Tuple2 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip2)]
- **<big>Unzip2</big>** : 根据传入的Tuple2切片创建一组和Tuple2元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip2)]
- **<big>Tuple3</big>** : 3 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple3)]
- **<big>Tuple3_Unbox</big>** : 返回 3 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple3_Unbox)]
- **<big>Zip3</big>** : 创建一个 Tuple3 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip3)]
- **<big>Unzip3</big>** : 根据传入的Tuple3切片创建一组和Tuple3元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip3)]
- **<big>Tuple4</big>** : 4 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple4)]
- **<big>Tuple4_Unbox</big>** : 返回 4 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple4_Unbox)]
- **<big>Zip4</big>** : 创建一个 Tuple4 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip4)]
- **<big>Unzip4</big>** : 根据传入的Tuple4切片创建一组和Tuple4元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip4)]
- **<big>Tuple5</big>** : 5 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple5)]
- **<big>Tuple5_Unbox</big>** : 返回 5 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple5_Unbox)]
- **<big>Zip5</big>** : 创建一个 Tuple5 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip5)]
- **<big>Unzip5</big>** : 根据传入的Tuple5切片创建一组和Tuple5元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip5)]
- **<big>Tuple6</big>** : 6 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple6)]
- **<big>Tuple6_Unbox</big>** : 返回 6 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple6_Unbox)]
- **<big>Zip6</big>** : 创建一个 Tuple6 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip6)]
- **<big>Unzip6</big>** : 根据传入的Tuple6切片创建一组和Tuple6元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip6)]
- **<big>Tuple7</big>** : 7 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple7)]
- **<big>Tuple7_Unbox</big>** : 返回 7 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple7_Unbox)]
- **<big>Zip7</big>** : 创建一个 Tuple7 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip7)]
- **<big>Unzip7</big>** : 根据传入的Tuple7切片创建一组和Tuple7元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip7)]
- **<big>Tuple8</big>** : 8 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple8)]
- **<big>Tuple8_Unbox</big>** : 返回 8 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple8_Unbox)]
- **<big>Zip8</big>** : 创建一个 Tuple8 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip8)]
- **<big>Unzip8</big>** : 根据传入的Tuple8切片创建一组和Tuple8元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip8)]
- **<big>Tuple9</big>** : 9 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple9)]
- **<big>Tuple9_Unbox</big>** : 返回 9 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple9_Unbox)]
- **<big>Zip9</big>** : 创建一个 Tuple9 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip9)]
- **<big>Unzip9</big>** : 根据传入的Tuple9切片创建一组和Tuple9元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip9)]
- **<big>Tuple10</big>** : 10 元元组
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple10)]
- **<big>Tuple10_Unbox</big>** : 返回 10 元元组的字段值。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Tuple10_Unbox)]
- **<big>Zip10</big>** : 创建一个 Tuple10 元组切片, 其中元组的元素和传入切片元素相对应。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Zip10)]
- **<big>Unzip10</big>** : 根据传入的Tuple10切片创建一组和Tuple10元素相对应的切片。
[[doc](https://github.com/duke-git/lancet/blob/main/docs/tuple_zh-CN.md#Unzip10)]
<h3 id="Validator"> 24. validator 验证器包,包含常用字符串格式验证函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/validator"
@@ -1568,7 +1701,7 @@ import "github.com/duke-git/lancet/v2/validator"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/validator_zh-CN.md#IsPrintable)]
[[play](https://go.dev/play/p/Pe1FE2gdtTP)]
### 23. xerror 包实现一些错误处理函数
<h3 id="Xerror"> 25. xerror 包实现一些错误处理函数。&nbsp; &nbsp; &nbsp; &nbsp;<a href="#index">回到目录</a></h3>
```go
import "github.com/duke-git/lancet/v2/xerror"

View File

@@ -7,6 +7,7 @@ import (
)
func TestLRUCache(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestLRUCache")
cache := NewLRUCache[int, int](3)

View File

@@ -7,6 +7,7 @@ import (
)
func TestLinearSearch(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestLinearSearch")
numbers := []int{3, 4, 5, 3, 2, 1}
@@ -19,6 +20,7 @@ func TestLinearSearch(t *testing.T) {
}
func TestBinarySearch(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestBinarySearch")
sortedNumbers := []int{1, 2, 3, 4, 5, 6, 7, 8}

View File

@@ -46,6 +46,7 @@ func (c *intComparator) Compare(v1 any, v2 any) int {
}
func TestBubbleSortForStructSlice(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestBubbleSortForStructSlice")
peoples := []people{
@@ -65,6 +66,7 @@ func TestBubbleSortForStructSlice(t *testing.T) {
}
func TestBubbleSortForIntSlice(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestBubbleSortForIntSlice")
numbers := []int{2, 1, 5, 3, 6, 4}
@@ -75,6 +77,7 @@ func TestBubbleSortForIntSlice(t *testing.T) {
}
func TestInsertionSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestInsertionSort")
peoples := []people{
@@ -94,6 +97,7 @@ func TestInsertionSort(t *testing.T) {
}
func TestSelectionSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestSelectionSort")
peoples := []people{
@@ -113,6 +117,7 @@ func TestSelectionSort(t *testing.T) {
}
func TestShellSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestShellSort")
peoples := []people{
@@ -132,6 +137,7 @@ func TestShellSort(t *testing.T) {
}
func TestQuickSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestQuickSort")
peoples := []people{
@@ -151,6 +157,7 @@ func TestQuickSort(t *testing.T) {
}
func TestHeapSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestHeapSort")
peoples := []people{
@@ -170,6 +177,7 @@ func TestHeapSort(t *testing.T) {
}
func TestMergeSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestMergeSort")
peoples := []people{
@@ -189,6 +197,7 @@ func TestMergeSort(t *testing.T) {
}
func TestCountSort(t *testing.T) {
t.Parallel()
asssert := internal.NewAssert(t, "TestCountSort")
peoples := []people{

View File

@@ -8,6 +8,7 @@ import (
)
func TestEqual(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEqual")
assert.Equal(true, Equal(1, 1))
@@ -60,6 +61,7 @@ func TestEqual(t *testing.T) {
}
func TestEqualValue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEqualValue")
assert.Equal(true, EqualValue(1, 1))
@@ -70,6 +72,7 @@ func TestEqualValue(t *testing.T) {
}
func TestLessThan(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLessThan")
assert.Equal(true, LessThan(1, 2))
@@ -85,6 +88,7 @@ func TestLessThan(t *testing.T) {
}
func TestGreaterThan(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGreaterThan")
assert.Equal(true, GreaterThan(2, 1))
@@ -101,6 +105,7 @@ func TestGreaterThan(t *testing.T) {
}
func TestLessOrEqual(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLessOrEqual")
assert.Equal(true, LessOrEqual(1, 2))
@@ -117,6 +122,7 @@ func TestLessOrEqual(t *testing.T) {
}
func TestGreaterOrEqual(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGreaterThan")
assert.Equal(true, GreaterOrEqual(2, 1))

View File

@@ -9,6 +9,7 @@ import (
)
func TestGenerate(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGenerate")
ctx, cancel := context.WithCancel(context.Background())
@@ -23,6 +24,7 @@ func TestGenerate(t *testing.T) {
}
func TestRepeat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRepeat")
ctx, cancel := context.WithCancel(context.Background())
@@ -39,6 +41,7 @@ func TestRepeat(t *testing.T) {
}
func TestRepeatFn(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRepeatFn")
ctx, cancel := context.WithCancel(context.Background())
@@ -57,6 +60,7 @@ func TestRepeatFn(t *testing.T) {
}
func TestTake(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTake")
ctx, cancel := context.WithCancel(context.Background())
@@ -79,6 +83,7 @@ func TestTake(t *testing.T) {
}
func TestFanIn(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFanIn")
ctx, cancel := context.WithCancel(context.Background())
@@ -101,6 +106,7 @@ func TestFanIn(t *testing.T) {
}
func TestOr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOr")
sig := func(after time.Duration) <-chan any {
@@ -127,6 +133,7 @@ func TestOr(t *testing.T) {
}
func TestOrDone(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOrDone")
ctx, cancel := context.WithCancel(context.Background())
@@ -141,6 +148,7 @@ func TestOrDone(t *testing.T) {
}
func TestTee(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTee")
ctx, cancel := context.WithCancel(context.Background())
@@ -159,6 +167,7 @@ func TestTee(t *testing.T) {
}
func TestBridge(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBridge")
ctx, cancel := context.WithCancel(context.Background())

View File

@@ -11,6 +11,8 @@ import (
type TestStruct struct{}
func TestBool(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBool")
// bool
@@ -63,6 +65,8 @@ func TestBool(t *testing.T) {
}
func TestAnd(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAnd")
assert.Equal(false, And(0, 1))
assert.Equal(false, And(0, ""))
@@ -71,6 +75,8 @@ func TestAnd(t *testing.T) {
}
func TestOr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOr")
assert.Equal(false, Or(0, ""))
assert.Equal(true, Or(0, 1))
@@ -79,6 +85,8 @@ func TestOr(t *testing.T) {
}
func TestXor(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOr")
assert.Equal(false, Xor(0, 0))
assert.Equal(true, Xor(0, 1))
@@ -87,6 +95,8 @@ func TestXor(t *testing.T) {
}
func TestNor(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestNor")
assert.Equal(true, Nor(0, 0))
assert.Equal(false, Nor(0, 1))
@@ -95,6 +105,8 @@ func TestNor(t *testing.T) {
}
func TestXnor(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestXnor")
assert.Equal(true, Xnor(0, 0))
assert.Equal(false, Xnor(0, 1))
@@ -103,6 +115,8 @@ func TestXnor(t *testing.T) {
}
func TestNand(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestNand")
assert.Equal(true, Nand(0, 0))
assert.Equal(true, Nand(0, 1))
@@ -111,7 +125,10 @@ func TestNand(t *testing.T) {
}
func TestTernaryOperator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TernaryOperator")
trueValue := "1"
falseValue := "0"

View File

@@ -380,7 +380,7 @@ func ToInterface(v reflect.Value) (value interface{}, ok bool) {
}
// Utf8ToGbk convert utf8 encoding data to GBK encoding data.
// Play: todo
// Play: https://go.dev/play/p/9FlIaFLArIL
func Utf8ToGbk(bs []byte) ([]byte, error) {
r := transform.NewReader(bytes.NewReader(bs), simplifiedchinese.GBK.NewEncoder())
b, err := io.ReadAll(r)
@@ -388,7 +388,7 @@ func Utf8ToGbk(bs []byte) ([]byte, error) {
}
// GbkToUtf8 convert GBK encoding data to utf8 encoding data.
// Play: todo
// Play: https://go.dev/play/p/OphmHCN_9u8
func GbkToUtf8(bs []byte) ([]byte, error) {
r := transform.NewReader(bytes.NewReader(bs), simplifiedchinese.GBK.NewDecoder())
b, err := io.ReadAll(r)

View File

@@ -13,6 +13,8 @@ import (
)
func TestToChar(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToChar")
cases := []string{"", "abc", "1 2#3"}
@@ -27,6 +29,8 @@ func TestToChar(t *testing.T) {
}
func TestToChannel(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToChannel")
ch := ToChannel([]int{1, 2, 3})
@@ -39,6 +43,8 @@ func TestToChannel(t *testing.T) {
}
func TestToBool(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToBool")
cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
@@ -51,6 +57,8 @@ func TestToBool(t *testing.T) {
}
func TestToBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToBytes")
cases := []any{
@@ -77,6 +85,8 @@ func TestToBytes(t *testing.T) {
}
func TestToInt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToInt")
cases := []any{"123", "-123", 123,
@@ -93,6 +103,8 @@ func TestToInt(t *testing.T) {
}
func TestToFloat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToFloat")
cases := []any{
@@ -111,6 +123,8 @@ func TestToFloat(t *testing.T) {
}
func TestToString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToString")
aMap := make(map[string]int)
@@ -146,6 +160,8 @@ func TestToString(t *testing.T) {
}
}
func TestToJson(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToJson")
var aMap = map[string]int{"a": 1, "b": 2, "c": 3}
@@ -161,6 +177,8 @@ func TestToJson(t *testing.T) {
}
func TestToMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToMap")
type Message struct {
@@ -180,6 +198,8 @@ func TestToMap(t *testing.T) {
}
func TestStructToMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStructToMap")
t.Run("StructToMap", func(_ *testing.T) {
@@ -215,6 +235,8 @@ func TestStructToMap(t *testing.T) {
}
func TestMapToSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMapToSlice")
aMap := map[string]int{"a": 1, "b": 2, "c": 3}
@@ -229,6 +251,8 @@ func TestMapToSlice(t *testing.T) {
}
func TestColorHexToRGB(t *testing.T) {
t.Parallel()
colorHex := "#003366"
r, g, b := ColorHexToRGB(colorHex)
colorRGB := fmt.Sprintf("%d,%d,%d", r, g, b)
@@ -239,6 +263,8 @@ func TestColorHexToRGB(t *testing.T) {
}
func TestColorRGBToHex(t *testing.T) {
t.Parallel()
r := 0
g := 51
b := 102
@@ -250,6 +276,8 @@ func TestColorRGBToHex(t *testing.T) {
}
func TestToPointer(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToPointer")
result := ToPointer(123)
@@ -257,6 +285,8 @@ func TestToPointer(t *testing.T) {
}
func TestEncodeByte(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEncodeByte")
byteData, _ := EncodeByte("abc")
@@ -266,6 +296,8 @@ func TestEncodeByte(t *testing.T) {
}
func TestDecodeByte(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDecodeByte")
var obj string
@@ -276,6 +308,8 @@ func TestDecodeByte(t *testing.T) {
}
func TestDeepClone(t *testing.T) {
t.Parallel()
// assert := internal.NewAssert(t, "TestDeepClone")
type Struct struct {
@@ -319,6 +353,8 @@ func TestDeepClone(t *testing.T) {
}
func TestCopyProperties(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCopyProperties")
type Disk struct {
@@ -371,6 +407,8 @@ func TestCopyProperties(t *testing.T) {
}
func TestToInterface(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToInterface")
cases := []reflect.Value{
@@ -400,6 +438,7 @@ func TestToInterface(t *testing.T) {
}
func TestUtf8ToGbk(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUtf8ToGbk")
utf8Data := []byte("hello")
@@ -411,6 +450,7 @@ func TestUtf8ToGbk(t *testing.T) {
}
func TestGbkToUtf8(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGbkToUtf8")
gbkData, err := Utf8ToGbk([]byte("hello"))

View File

@@ -40,6 +40,14 @@ func Md5String(s string) string {
return hex.EncodeToString(h.Sum(nil))
}
// Md5String return the md5 string of byte slice.
// Play: todo
func Md5Byte(data []byte) string {
h := md5.New()
h.Write(data)
return hex.EncodeToString(h.Sum(nil))
}
// Md5File return the md5 value of file.
func Md5File(filename string) (string, error) {
if fileInfo, err := os.Stat(filename); err != nil {

View File

@@ -7,21 +7,37 @@ import (
)
func TestBase64StdEncode(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBase64StdEncode")
assert.Equal("aGVsbG8gd29ybGQ=", Base64StdEncode("hello world"))
}
func TestBase64StdDecode(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBase64StdDecode")
assert.Equal("hello world", Base64StdDecode("aGVsbG8gd29ybGQ="))
}
func TestMd5String(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMd5String")
assert.Equal("5d41402abc4b2a76b9719d911017c592", Md5String("hello"))
}
func TestMd5Byte(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMd5Byte")
data := []byte{'a'}
assert.Equal("0cc175b9c0f1b6a831c399e269772661", Md5Byte(data))
}
func TestMd5File(t *testing.T) {
t.Parallel()
fileMd5, err := Md5File("./basic.go")
assert := internal.NewAssert(t, "TestMd5File")
assert.IsNotNil(fileMd5)
@@ -29,11 +45,15 @@ func TestMd5File(t *testing.T) {
}
func TestHmacMd5(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHmacMd5")
assert.Equal("5f4c9faaff0a1ad3007d9ddc06abe36d", HmacMd5("hello world", "12345"))
}
func TestHmacSha1(t *testing.T) {
t.Parallel()
s := "hello world"
key := "12345"
hmacSha1 := HmacSha1(s, key)
@@ -44,6 +64,8 @@ func TestHmacSha1(t *testing.T) {
}
func TestHmacSha256(t *testing.T) {
t.Parallel()
s := "hello world"
key := "12345"
hmacSha256 := HmacSha256(s, key)
@@ -54,6 +76,8 @@ func TestHmacSha256(t *testing.T) {
}
func TestHmacSha512(t *testing.T) {
t.Parallel()
s := "hello world"
key := "12345"
hmacSha512 := HmacSha512(s, key)
@@ -64,6 +88,8 @@ func TestHmacSha512(t *testing.T) {
}
func TestSha1(t *testing.T) {
t.Parallel()
s := "hello world"
sha1 := Sha1(s)
expected := "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
@@ -73,6 +99,8 @@ func TestSha1(t *testing.T) {
}
func TestSha256(t *testing.T) {
t.Parallel()
s := "hello world"
sha256 := Sha256(s)
expected := "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
@@ -82,6 +110,8 @@ func TestSha256(t *testing.T) {
}
func TestSha512(t *testing.T) {
t.Parallel()
s := "hello world"
sha512 := Sha512(s)
expected := "309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f"

View File

@@ -366,21 +366,22 @@ func ExampleHmacSha512() {
}
func ExampleMd5String() {
str := "hello"
md5Str := Md5String(str)
md5Str := Md5String("hello")
fmt.Println(md5Str)
// Output:
// 5d41402abc4b2a76b9719d911017c592
}
func ExampleMd5Byte() {
md5Str := Md5Byte([]byte{'a'})
fmt.Println(md5Str)
// Output:
// 0cc175b9c0f1b6a831c399e269772661
}
func ExampleSha1() {
str := "hello"
result := Sha1(str)
result := Sha1("hello")
fmt.Println(result)
// Output:
@@ -388,10 +389,7 @@ func ExampleSha1() {
}
func ExampleSha256() {
str := "hello"
result := Sha256(str)
result := Sha256("hello")
fmt.Println(result)
// Output:
@@ -399,10 +397,7 @@ func ExampleSha256() {
}
func ExampleSha512() {
str := "hello"
result := Sha512(str)
result := Sha512("hello")
fmt.Println(result)
// Output:

View File

@@ -7,6 +7,8 @@ import (
)
func TestAesEcbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefghijklmnop"
@@ -18,6 +20,8 @@ func TestAesEcbEncrypt(t *testing.T) {
}
func TestAesCbcEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefghijklmnop"
@@ -29,6 +33,8 @@ func TestAesCbcEncrypt(t *testing.T) {
}
func TestAesCtrCrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefghijklmnop"
@@ -40,6 +46,8 @@ func TestAesCtrCrypt(t *testing.T) {
}
func TestAesCfbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefghijklmnop"
@@ -51,6 +59,8 @@ func TestAesCfbEncrypt(t *testing.T) {
}
func TestAesOfbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefghijklmnop"
@@ -62,6 +72,8 @@ func TestAesOfbEncrypt(t *testing.T) {
}
func TestDesEcbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefgh"
@@ -73,6 +85,8 @@ func TestDesEcbEncrypt(t *testing.T) {
}
func TestDesCbcEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefgh"
@@ -84,6 +98,8 @@ func TestDesCbcEncrypt(t *testing.T) {
}
func TestDesCtrCrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefgh"
@@ -95,6 +111,8 @@ func TestDesCtrCrypt(t *testing.T) {
}
func TestDesCfbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefgh"
@@ -106,6 +124,8 @@ func TestDesCfbEncrypt(t *testing.T) {
}
func TestDesOfbEncrypt(t *testing.T) {
t.Parallel()
data := "hello world"
key := "abcdefgh"
@@ -117,6 +137,8 @@ func TestDesOfbEncrypt(t *testing.T) {
}
func TestRsaEncrypt(t *testing.T) {
t.Parallel()
err := GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
if err != nil {
t.FailNow()

View File

@@ -32,6 +32,8 @@ func TestHashMap_Resize(t *testing.T) {
}
func TestHashMap_Delete(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHashMap_Delete")
hm := NewHashMap()
@@ -44,6 +46,8 @@ func TestHashMap_Delete(t *testing.T) {
}
func TestHashMap_Contains(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHashMap_Contains")
hm := NewHashMap()
@@ -54,6 +58,8 @@ func TestHashMap_Contains(t *testing.T) {
}
func TestHashMap_KeysValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHashMap_KeysValues")
hm := NewHashMap()

View File

@@ -21,6 +21,8 @@ func (c *intComparator) Compare(v1, v2 any) int {
}
func TestMaxHeap_BuildMaxHeap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMaxHeap_BuildMaxHeap")
values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
@@ -33,6 +35,8 @@ func TestMaxHeap_BuildMaxHeap(t *testing.T) {
}
func TestMaxHeap_Push(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMaxHeap_Push")
heap := NewMaxHeap[int](&intComparator{})
@@ -51,6 +55,8 @@ func TestMaxHeap_Push(t *testing.T) {
}
func TestMaxHeap_Pop(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMaxHeap_Pop")
heap := NewMaxHeap[int](&intComparator{})
@@ -70,6 +76,8 @@ func TestMaxHeap_Pop(t *testing.T) {
}
func TestMaxHeap_Peek(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMaxHeap_Peek")
heap := NewMaxHeap[int](&intComparator{})

View File

@@ -7,6 +7,8 @@ import (
)
func TestDoublyLink_InsertAtFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_InsertAtFirst")
link := NewDoublyLink[int]()
@@ -22,6 +24,8 @@ func TestDoublyLink_InsertAtFirst(t *testing.T) {
}
func TestDoublyLink_InsertAtTail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_InsertAtTail")
link := NewDoublyLink[int]()
@@ -37,12 +41,12 @@ func TestDoublyLink_InsertAtTail(t *testing.T) {
}
func TestDoublyLink_InsertAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_InsertAt")
link := NewDoublyLink[int]()
link.InsertAt(1, 1) //do nothing
link.InsertAt(0, 1)
link.InsertAt(1, 2)
link.InsertAt(2, 4)
@@ -55,6 +59,8 @@ func TestDoublyLink_InsertAt(t *testing.T) {
}
func TestDoublyLink_DeleteAtHead(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_DeleteAtHead")
link := NewDoublyLink[int]()
@@ -74,6 +80,8 @@ func TestDoublyLink_DeleteAtHead(t *testing.T) {
}
func TestDoublyLink_DeleteAtTail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_DeleteAtTail")
link := NewDoublyLink[int]()
@@ -93,6 +101,8 @@ func TestDoublyLink_DeleteAtTail(t *testing.T) {
}
func TestDoublyLink_DeleteAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_DeleteAt")
link := NewDoublyLink[int]()
@@ -116,6 +126,8 @@ func TestDoublyLink_DeleteAt(t *testing.T) {
}
func TestDoublyLink_Reverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_Reverse")
link := NewDoublyLink[int]()
@@ -130,6 +142,8 @@ func TestDoublyLink_Reverse(t *testing.T) {
}
func TestDoublyLink_GetMiddleNode(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_GetMiddleNode")
link := NewDoublyLink[int]()
@@ -149,10 +163,11 @@ func TestDoublyLink_GetMiddleNode(t *testing.T) {
}
func TestDoublyLink_Clear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDoublyLink_Clear")
link := NewDoublyLink[int]()
assert.Equal(true, link.IsEmpty())
assert.Equal(0, link.Size())

View File

@@ -7,6 +7,8 @@ import (
)
func TestSinglyLink_InsertAtFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_InsertAtFirst")
link := NewSinglyLink[int]()
@@ -22,6 +24,8 @@ func TestSinglyLink_InsertAtFirst(t *testing.T) {
}
func TestSinglyLink_InsertAtTail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_InsertAtTail")
link := NewSinglyLink[int]()
@@ -37,6 +41,8 @@ func TestSinglyLink_InsertAtTail(t *testing.T) {
}
func TestSinglyLink_InsertAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_InsertAt")
link := NewSinglyLink[int]()
@@ -57,6 +63,8 @@ func TestSinglyLink_InsertAt(t *testing.T) {
}
func TestSinglyLink_DeleteAtHead(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_DeleteAtHead")
link := NewSinglyLink[int]()
@@ -78,10 +86,11 @@ func TestSinglyLink_DeleteAtHead(t *testing.T) {
}
func TestSinglyLink_DeleteAtTail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_DeleteAtTail")
link := NewSinglyLink[int]()
link.InsertAtTail(1)
link.InsertAtTail(2)
link.InsertAtTail(3)
@@ -96,10 +105,11 @@ func TestSinglyLink_DeleteAtTail(t *testing.T) {
}
func TestSinglyLink_DeleteValue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_DeleteValue")
link := NewSinglyLink[int]()
link.InsertAtTail(1)
link.InsertAtTail(2)
link.InsertAtTail(2)
@@ -114,10 +124,11 @@ func TestSinglyLink_DeleteValue(t *testing.T) {
}
func TestSinglyLink_DeleteAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_DeleteAt")
link := NewSinglyLink[int]()
link.InsertAtTail(1)
link.InsertAtTail(2)
link.InsertAtTail(3)
@@ -136,6 +147,8 @@ func TestSinglyLink_DeleteAt(t *testing.T) {
}
func TestSinglyLink_Reverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_Reverse")
link := NewSinglyLink[int]()
@@ -149,6 +162,8 @@ func TestSinglyLink_Reverse(t *testing.T) {
}
func TestSinglyLink_GetMiddleNode(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSinglyLink_GetMiddleNode")
link := NewSinglyLink[int]()
@@ -163,6 +178,7 @@ func TestSinglyLink_GetMiddleNode(t *testing.T) {
link.InsertAtTail(5)
link.InsertAtTail(6)
link.InsertAtTail(7)
middle2 := link.GetMiddleNode()
assert.Equal(4, middle2.Value)
}

View File

@@ -7,6 +7,8 @@ import (
)
func TestListData(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestListData")
list := NewList([]int{1, 2, 3})
@@ -14,6 +16,8 @@ func TestListData(t *testing.T) {
}
func TestValueOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestValueOf")
list := NewList([]int{1, 2, 3})
@@ -26,6 +30,8 @@ func TestValueOf(t *testing.T) {
}
func TestIndexOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOf")
list := NewList([]int{1, 2, 3})
@@ -37,6 +43,8 @@ func TestIndexOf(t *testing.T) {
}
func TestIndexOfFunc(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOf")
list := NewList([]int{1, 2, 3})
@@ -48,6 +56,8 @@ func TestIndexOfFunc(t *testing.T) {
}
func TestLastIndexOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOf")
list := NewList([]int{1, 2, 3, 3, 3, 3, 4, 5, 6, 9})
@@ -65,6 +75,8 @@ func TestLastIndexOf(t *testing.T) {
}
func TestLastIndexOfFunc(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOf")
list := NewList([]int{1, 2, 3, 3, 3, 3, 4, 5, 6, 9})
@@ -82,6 +94,8 @@ func TestLastIndexOfFunc(t *testing.T) {
}
func TestContain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContain")
list := NewList([]int{1, 2, 3})
@@ -90,6 +104,8 @@ func TestContain(t *testing.T) {
}
func TestPush(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPush")
list := NewList([]int{1, 2, 3})
@@ -99,6 +115,8 @@ func TestPush(t *testing.T) {
}
func TestInsertAtFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestInsertAtFirst")
list := NewList([]int{1, 2, 3})
@@ -108,6 +126,8 @@ func TestInsertAtFirst(t *testing.T) {
}
func TestInsertAtLast(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestInsertAtLast")
list := NewList([]int{1, 2, 3})
@@ -117,6 +137,8 @@ func TestInsertAtLast(t *testing.T) {
}
func TestInsertAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestInsertAt")
list := NewList([]int{1, 2, 3})
@@ -135,6 +157,8 @@ func TestInsertAt(t *testing.T) {
}
func TestPopFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPopFirst")
list := NewList([]int{1, 2, 3})
@@ -150,6 +174,8 @@ func TestPopFirst(t *testing.T) {
}
func TestPopLast(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPopLast")
list := NewList([]int{1, 2, 3})
@@ -165,6 +191,8 @@ func TestPopLast(t *testing.T) {
}
func TestDeleteAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDeleteAt")
list := NewList([]int{1, 2, 3, 4})
@@ -183,6 +211,8 @@ func TestDeleteAt(t *testing.T) {
}
func TestUpdateAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUpdateAt")
list := NewList([]int{1, 2, 3, 4})
@@ -201,6 +231,8 @@ func TestUpdateAt(t *testing.T) {
}
func TestEqual(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEqual")
list1 := NewList([]int{1, 2, 3, 4})
@@ -212,6 +244,8 @@ func TestEqual(t *testing.T) {
}
func TestIsEmpty(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsEmpty")
list1 := NewList([]int{1, 2, 3, 4})
@@ -222,6 +256,8 @@ func TestIsEmpty(t *testing.T) {
}
func TestIsClear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsClear")
list1 := NewList([]int{1, 2, 3, 4})
@@ -232,6 +268,8 @@ func TestIsClear(t *testing.T) {
}
func TestClone(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestClone")
list1 := NewList([]int{1, 2, 3, 4})
@@ -241,6 +279,8 @@ func TestClone(t *testing.T) {
}
func TestMerge(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMerge")
list1 := NewList([]int{1, 2, 3, 4})
@@ -252,6 +292,8 @@ func TestMerge(t *testing.T) {
}
func TestSize(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSize")
list := NewList([]int{1, 2, 3, 4})
@@ -262,6 +304,8 @@ func TestSize(t *testing.T) {
}
func TestCap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCap")
data := make([]int, 0, 100)
@@ -274,6 +318,8 @@ func TestCap(t *testing.T) {
}
func TestSwap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSwap")
list := NewList([]int{1, 2, 3, 4})
@@ -285,6 +331,8 @@ func TestSwap(t *testing.T) {
}
func TestReverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReverse")
list := NewList([]int{1, 2, 3, 4})
@@ -296,6 +344,8 @@ func TestReverse(t *testing.T) {
}
func TestUnique(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnique")
list := NewList([]int{1, 2, 2, 3, 4})
@@ -307,6 +357,8 @@ func TestUnique(t *testing.T) {
}
func TestUnion(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnion")
list1 := NewList([]int{1, 2, 3, 4})
@@ -318,6 +370,8 @@ func TestUnion(t *testing.T) {
}
func TestIntersection(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIntersection")
list1 := NewList([]int{1, 2, 3, 4})
@@ -329,6 +383,8 @@ func TestIntersection(t *testing.T) {
}
func TestDifference(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDifference")
list1 := NewList([]int{1, 2, 3})
@@ -340,6 +396,8 @@ func TestDifference(t *testing.T) {
}
func TestSymmetricDifference(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSymmetricDifference")
list1 := NewList([]int{1, 2, 3})
@@ -351,6 +409,8 @@ func TestSymmetricDifference(t *testing.T) {
}
func TestSubSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSubSlice")
list := NewList([]int{1, 2, 3, 4, 5, 8})
@@ -367,6 +427,8 @@ func BenchmarkSubSlice(b *testing.B) {
}
func TestDeleteIf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDeleteIf")
list := NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
@@ -381,10 +443,11 @@ func TestDeleteIf(t *testing.T) {
}
func TestForEach(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestForEach")
list := NewList([]int{1, 2, 3, 4})
rs := make([]int, 0)
list.ForEach(func(i int) {
rs = append(rs, i)
@@ -394,6 +457,8 @@ func TestForEach(t *testing.T) {
}
func TestRetainAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRetainAll")
list := NewList([]int{1, 2, 3, 4})
@@ -414,6 +479,8 @@ func TestRetainAll(t *testing.T) {
}
func TestDeleteAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDeleteAll")
list := NewList([]int{1, 2, 3, 4})
@@ -433,10 +500,11 @@ func TestDeleteAll(t *testing.T) {
}
func TestIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIterator")
list := NewList([]int{1, 2, 3, 4})
iterator := list.Iterator()
rs := make([]int, 0)
@@ -449,14 +517,15 @@ func TestIterator(t *testing.T) {
}
func TestListToMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "ListToMap")
list := NewList([]int{1, 2, 3, 4})
result := ListToMap(list, func(n int) (int, bool) {
return n, n > 1
})
expected := map[int]bool{1: false, 2: true, 3: true, 4: true}
expected := map[int]bool{1: false, 2: true, 3: true, 4: true}
assert.Equal(expected, result)
}

View File

@@ -7,6 +7,8 @@ import (
)
func TestArrayQueue_Enqueue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Enqueue")
queue := NewArrayQueue[int](5)
@@ -14,15 +16,16 @@ func TestArrayQueue_Enqueue(t *testing.T) {
queue.Enqueue(2)
queue.Enqueue(3)
expected := []int{1, 2, 3}
data := queue.Data()
size := queue.Size()
assert.Equal(expected, data)
assert.Equal([]int{1, 2, 3}, data)
assert.Equal(3, size)
}
func TestArrayQueue_Dequeue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Dequeue")
queue := NewArrayQueue[int](4)
@@ -38,6 +41,8 @@ func TestArrayQueue_Dequeue(t *testing.T) {
}
func TestArrayQueue_Front(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Front")
queue := NewArrayQueue[int](4)
@@ -52,6 +57,8 @@ func TestArrayQueue_Front(t *testing.T) {
}
func TestArrayQueue_Back(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Back")
queue := NewArrayQueue[int](4)
@@ -66,6 +73,8 @@ func TestArrayQueue_Back(t *testing.T) {
}
func TestArrayQueue_Contain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Contain")
queue := NewArrayQueue[int](4)
@@ -78,6 +87,8 @@ func TestArrayQueue_Contain(t *testing.T) {
}
func TestArrayQueue_Clear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_Clear")
queue := NewArrayQueue[int](4)
@@ -95,6 +106,8 @@ func TestArrayQueue_Clear(t *testing.T) {
}
func TestArrayQueue_IsFull(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayQueue_IsFull")
queue := NewArrayQueue[int](3)

View File

@@ -7,6 +7,8 @@ import (
)
func TestCircularQueue_Enqueue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Enqueue")
queue := NewCircularQueue[int](6)
@@ -34,6 +36,8 @@ func TestCircularQueue_Enqueue(t *testing.T) {
}
func TestCircularQueue_Dequeue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_DeQueue")
queue := NewCircularQueue[int](4)
@@ -60,6 +64,8 @@ func TestCircularQueue_Dequeue(t *testing.T) {
}
func TestCircularQueue_Front(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Front")
queue := NewCircularQueue[int](6)
@@ -80,6 +86,8 @@ func TestCircularQueue_Front(t *testing.T) {
}
func TestCircularQueue_Back(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Back")
queue := NewCircularQueue[int](3)
@@ -103,6 +111,8 @@ func TestCircularQueue_Back(t *testing.T) {
}
func TestCircularQueue_Contain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Contain")
queue := NewCircularQueue[int](2)
@@ -114,6 +124,8 @@ func TestCircularQueue_Contain(t *testing.T) {
}
func TestCircularQueue_Clear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Clear")
queue := NewCircularQueue[int](3)
@@ -132,6 +144,8 @@ func TestCircularQueue_Clear(t *testing.T) {
}
func TestCircularQueue_Data(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCircularQueue_Data")
queue := NewCircularQueue[int](3)

View File

@@ -7,6 +7,8 @@ import (
)
func TestLinkedQueue_Enqueue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_Enqueue")
queue := NewLinkedQueue[int]()
@@ -19,6 +21,8 @@ func TestLinkedQueue_Enqueue(t *testing.T) {
}
func TestLinkedQueue_Dequeue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_DeQueue")
queue := NewLinkedQueue[int]()
@@ -35,6 +39,8 @@ func TestLinkedQueue_Dequeue(t *testing.T) {
}
func TestLinkedQueue_Front(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_Front")
queue := NewLinkedQueue[int]()
@@ -51,6 +57,8 @@ func TestLinkedQueue_Front(t *testing.T) {
}
func TestLinkedQueue_Back(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_Back")
queue := NewLinkedQueue[int]()
@@ -67,6 +75,8 @@ func TestLinkedQueue_Back(t *testing.T) {
}
func TestLinkedQueue_Clear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_Back")
queue := NewLinkedQueue[int]()
@@ -82,10 +92,11 @@ func TestLinkedQueue_Clear(t *testing.T) {
}
func TestLinkedQueue_Contain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedQueue_Contain")
queue := NewLinkedQueue[int]()
queue.Enqueue(1)
queue.Enqueue(2)
queue.Enqueue(3)

View File

@@ -20,6 +20,8 @@ func (c *intComparator) Compare(v1, v2 any) int {
return 0
}
func TestPriorityQueue_Enqueue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPriorityQueue_Enqueue")
comparator := &intComparator{}
@@ -45,6 +47,8 @@ func TestPriorityQueue_Enqueue(t *testing.T) {
}
func TestPriorityQueue_Dequeue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPriorityQueue_Dequeue")
comparator := &intComparator{}

View File

@@ -7,6 +7,8 @@ import (
)
func TestSet_NewSetFromSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_NewSetFromSlice")
s1 := NewSetFromSlice([]int{1, 2, 2, 3})
@@ -20,17 +22,21 @@ func TestSet_NewSetFromSlice(t *testing.T) {
}
func TestSet_Add(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Add")
set := NewSet[int]()
set.Add(1, 2, 3)
expected := NewSet(1, 2, 3)
cmpSet := NewSet(1, 2, 3)
assert.Equal(true, set.Equal(expected))
assert.Equal(true, set.Equal(cmpSet))
}
func TestSet_AddIfNotExist(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_AddIfNotExist")
set := NewSet[int]()
@@ -42,6 +48,8 @@ func TestSet_AddIfNotExist(t *testing.T) {
}
func TestSet_AddIfNotExistBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_AddIfNotExistBy")
set := NewSet[int]()
@@ -63,6 +71,8 @@ func TestSet_AddIfNotExistBy(t *testing.T) {
}
func TestSet_Contain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Contain")
set := NewSet[int]()
@@ -73,6 +83,8 @@ func TestSet_Contain(t *testing.T) {
}
func TestSet_ContainAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_ContainAll")
set1 := NewSet(1, 2, 3)
@@ -84,6 +96,8 @@ func TestSet_ContainAll(t *testing.T) {
}
func TestSet_Clone(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Clone")
set1 := NewSet(1, 2, 3)
@@ -94,18 +108,20 @@ func TestSet_Clone(t *testing.T) {
}
func TestSet_Delete(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Delete")
set := NewSet[int]()
set.Add(1, 2, 3)
set.Delete(3)
expected := NewSet(1, 2)
assert.Equal(true, set.Equal(expected))
assert.Equal(true, set.Equal(NewSet(1, 2)))
}
func TestSet_Equal(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Equal")
set1 := NewSet(1, 2, 3)
@@ -117,6 +133,8 @@ func TestSet_Equal(t *testing.T) {
}
func TestSet_Iterate(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Iterate")
set := NewSet(1, 2, 3)
@@ -129,6 +147,8 @@ func TestSet_Iterate(t *testing.T) {
}
func TestSet_IsEmpty(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_IsEmpty")
set := NewSet[int]()
@@ -136,6 +156,8 @@ func TestSet_IsEmpty(t *testing.T) {
}
func TestSet_Size(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Size")
set := NewSet(1, 2, 3)
@@ -143,6 +165,8 @@ func TestSet_Size(t *testing.T) {
}
func TestSet_Values(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Values")
set := NewSet(1, 2, 3)
@@ -152,28 +176,33 @@ func TestSet_Values(t *testing.T) {
}
func TestSet_Union(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Union")
set1 := NewSet(1, 2, 3)
set2 := NewSet(2, 3, 4, 5)
expected := NewSet(1, 2, 3, 4, 5)
unionSet := set1.Union(set2)
assert.Equal(expected, unionSet)
assert.Equal(NewSet(1, 2, 3, 4, 5), unionSet)
}
func TestSet_Intersection(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Intersection")
set1 := NewSet(1, 2, 3)
set2 := NewSet(2, 3, 4, 5)
expected := NewSet(2, 3)
intersectionSet := set1.Intersection(set2)
assert.Equal(expected, intersectionSet)
assert.Equal(NewSet(2, 3), intersectionSet)
}
func TestSet_SymmetricDifference(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_SymmetricDifference")
set1 := NewSet(1, 2, 3)
@@ -183,6 +212,8 @@ func TestSet_SymmetricDifference(t *testing.T) {
}
func TestSet_Minus(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSet_Minus")
set1 := NewSet(1, 2, 3)

View File

@@ -7,6 +7,8 @@ import (
)
func TestArrayStack_Push(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayStack_Push")
stack := NewArrayStack[int]()
@@ -14,15 +16,16 @@ func TestArrayStack_Push(t *testing.T) {
stack.Push(2)
stack.Push(3)
expected := []int{3, 2, 1}
values := stack.Data()
length := stack.Size()
assert.Equal(expected, values)
assert.Equal([]int{3, 2, 1}, values)
assert.Equal(3, length)
}
func TestArrayStack_Pop(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayStack_Pop")
stack := NewArrayStack[int]()
@@ -37,11 +40,12 @@ func TestArrayStack_Pop(t *testing.T) {
assert.IsNil(err)
assert.Equal(3, *topItem)
expected := []int{2, 1}
assert.Equal(expected, stack.Data())
assert.Equal([]int{2, 1}, stack.Data())
}
func TestArrayStack_Peak(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayStack_Peak")
stack := NewArrayStack[int]()
@@ -56,11 +60,12 @@ func TestArrayStack_Peak(t *testing.T) {
assert.IsNil(err)
assert.Equal(3, *topItem)
expected := []int{3, 2, 1}
assert.Equal(expected, stack.Data())
assert.Equal([]int{3, 2, 1}, stack.Data())
}
func TestArrayStack_Clear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestArrayStack_Clear")
stack := NewArrayStack[int]()

View File

@@ -7,6 +7,8 @@ import (
)
func TestLinkedStack_Push(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedStack_Push")
stack := NewLinkedStack[int]()
@@ -14,15 +16,16 @@ func TestLinkedStack_Push(t *testing.T) {
stack.Push(2)
stack.Push(3)
expected := []int{3, 2, 1}
values := stack.Data()
size := stack.Size()
assert.Equal(expected, values)
assert.Equal([]int{3, 2, 1}, values)
assert.Equal(3, size)
}
func TestLinkedStack_Pop(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedStack_Pop")
stack := NewLinkedStack[int]()
@@ -37,12 +40,13 @@ func TestLinkedStack_Pop(t *testing.T) {
assert.IsNil(err)
assert.Equal(3, *topItem)
expected := []int{2, 1}
stack.Print()
assert.Equal(expected, stack.Data())
assert.Equal([]int{2, 1}, stack.Data())
}
func TestLinkedStack_Peak(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedStack_Peak")
stack := NewLinkedStack[int]()
@@ -57,11 +61,12 @@ func TestLinkedStack_Peak(t *testing.T) {
assert.IsNil(err)
assert.Equal(3, *topItem)
expected := []int{3, 2, 1}
assert.Equal(expected, stack.Data())
assert.Equal([]int{3, 2, 1}, stack.Data())
}
func TestLinkedStack_Empty(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLinkedStack_Empty")
stack := NewLinkedStack[int]()

View File

@@ -20,16 +20,9 @@ func (c *intComparator) Compare(v1, v2 any) int {
return 0
}
func TestBSTree_Insert(t *testing.T) {
bstree := NewBSTree(6, &intComparator{})
bstree.Insert(7)
bstree.Insert(5)
bstree.Insert(2)
bstree.Insert(4)
}
func TestBSTree_PreOrderTraverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_PreOrderTraverse")
bstree := NewBSTree(6, &intComparator{})
@@ -44,6 +37,8 @@ func TestBSTree_PreOrderTraverse(t *testing.T) {
}
func TestBSTree_PostOrderTraverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_PostOrderTraverse")
bstree := NewBSTree(6, &intComparator{})
@@ -58,6 +53,8 @@ func TestBSTree_PostOrderTraverse(t *testing.T) {
}
func TestBSTree_InOrderTraverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_InOrderTraverse")
bstree := NewBSTree(6, &intComparator{})
@@ -72,6 +69,8 @@ func TestBSTree_InOrderTraverse(t *testing.T) {
}
func TestBSTree_LevelOrderTraverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_LevelOrderTraverse")
bstree := NewBSTree(6, &intComparator{})
@@ -86,6 +85,8 @@ func TestBSTree_LevelOrderTraverse(t *testing.T) {
}
func TestBSTree_Delete(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_Delete")
bstree := NewBSTree(6, &intComparator{})
@@ -108,6 +109,8 @@ func TestBSTree_Delete(t *testing.T) {
}
func TestBSTree_Depth(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_Depth")
bstree := NewBSTree(6, &intComparator{})
@@ -121,6 +124,8 @@ func TestBSTree_Depth(t *testing.T) {
}
func TestBSTree_IsSubTree(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBSTree_IsSubTree")
superTree := NewBSTree(8, &intComparator{})

View File

@@ -7,6 +7,8 @@ import (
)
func TestToUnix(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToUnix")
tm1 := NewUnixNow()
@@ -17,6 +19,8 @@ func TestToUnix(t *testing.T) {
}
func TestToFormat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToFormat")
tm, err := NewFormat("2022-03-18 17:04:05")
@@ -25,18 +29,21 @@ func TestToFormat(t *testing.T) {
}
func TestToFormatForTpl(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToFormatForTpl")
_, err := NewFormat("2022/03/18 17:04:05")
assert.IsNotNil(err)
tm, err := NewFormat("2022-03-18 17:04:05")
// assert.Equal("2022/03/18 17:04:05", tm.ToFormatForTpl("2006/01/02 15:04:05"))
t.Log("TestToFormatForTpl", tm.ToFormatForTpl("2006/01/02 15:04:05"))
assert.IsNil(err)
}
func TestToIso8601(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToIso8601")
_, err := NewISO8601("2022-03-18 17:04:05")
@@ -44,6 +51,5 @@ func TestToIso8601(t *testing.T) {
tm, err := NewISO8601("2006-01-02T15:04:05.999Z")
t.Log("TestToIso8601", tm.ToIso8601())
// assert.Equal("2006-01-02T23:04:05+08:00", tm.ToIso8601())
assert.IsNil(err)
}

View File

@@ -96,6 +96,18 @@ func GetNowDateTime() string {
return time.Now().Format("2006-01-02 15:04:05")
}
// GetTodayStartTime return the start time of today, format: yyyy-mm-dd 00:00:00.
// Play: todo
func GetTodayStartTime() string {
return time.Now().Format("2006-01-02") + " 00:00:00"
}
// GetTodayEndTime return the end time of today, format: yyyy-mm-dd 23:59:59.
// Play: todo
func GetTodayEndTime() string {
return time.Now().Format("2006-01-02") + " 23:59:59"
}
// GetZeroHourTimestamp return timestamp of zero hour (timestamp of 00:00).
// Play: https://go.dev/play/p/QmL2oIaGE3q
func GetZeroHourTimestamp() int64 {

View File

@@ -8,6 +8,8 @@ import (
)
func TestAddYear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAddDay")
now := time.Now()
@@ -21,6 +23,8 @@ func TestAddYear(t *testing.T) {
}
func TestBetweenSeconds(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBetweenSeconds")
today := time.Now()
@@ -35,6 +39,8 @@ func TestBetweenSeconds(t *testing.T) {
}
func TestAddDay(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAddDay")
now := time.Now()
@@ -48,6 +54,8 @@ func TestAddDay(t *testing.T) {
}
func TestAddHour(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAddHour")
now := time.Now()
@@ -61,6 +69,8 @@ func TestAddHour(t *testing.T) {
}
func TestAddMinute(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAddMinute")
now := time.Now()
@@ -74,24 +84,48 @@ func TestAddMinute(t *testing.T) {
}
func TestGetNowDate(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetNowDate")
expected := time.Now().Format("2006-01-02")
assert.Equal(expected, GetNowDate())
}
func TestGetNowTime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetNowTime")
expected := time.Now().Format("15:04:05")
assert.Equal(expected, GetNowTime())
}
func TestGetNowDateTime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetNowDateTime")
expected := time.Now().Format("2006-01-02 15:04:05")
assert.Equal(expected, GetNowDateTime())
}
func TestGetTodayStartTime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetTodayStartTime")
expected := time.Now().Format("2006-01-02") + " 00:00:00"
assert.Equal(expected, GetTodayStartTime())
}
func TestGetTodayEndTime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetTodayEndTime")
expected := time.Now().Format("2006-01-02") + " 23:59:59"
assert.Equal(expected, GetTodayEndTime())
}
func TestFormatTimeToStr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFormatTimeToStr")
datetime, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
@@ -116,6 +150,8 @@ func TestFormatTimeToStr(t *testing.T) {
}
func TestFormatStrToTime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFormatStrToTime")
formats := []string{
@@ -143,6 +179,8 @@ func TestFormatStrToTime(t *testing.T) {
}
func TestBeginOfMinute(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfMinute")
expected := time.Date(2022, 2, 15, 15, 48, 0, 0, time.Local)
@@ -153,6 +191,8 @@ func TestBeginOfMinute(t *testing.T) {
}
func TestEndOfMinute(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfMinute")
expected := time.Date(2022, 2, 15, 15, 48, 59, 999999999, time.Local)
@@ -163,6 +203,8 @@ func TestEndOfMinute(t *testing.T) {
}
func TestBeginOfHour(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfHour")
expected := time.Date(2022, 2, 15, 15, 0, 0, 0, time.Local)
@@ -173,6 +215,8 @@ func TestBeginOfHour(t *testing.T) {
}
func TestEndOfHour(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfHour")
expected := time.Date(2022, 2, 15, 15, 59, 59, 999999999, time.Local)
@@ -183,6 +227,8 @@ func TestEndOfHour(t *testing.T) {
}
func TestBeginOfDay(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfDay")
expected := time.Date(2022, 2, 15, 0, 0, 0, 0, time.Local)
@@ -193,6 +239,8 @@ func TestBeginOfDay(t *testing.T) {
}
func TestEndOfDay(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfDay")
expected := time.Date(2022, 2, 15, 23, 59, 59, 999999999, time.Local)
@@ -203,6 +251,8 @@ func TestEndOfDay(t *testing.T) {
}
func TestBeginOfWeek(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfWeek")
expected := time.Date(2022, 2, 13, 0, 0, 0, 0, time.Local)
@@ -213,6 +263,8 @@ func TestBeginOfWeek(t *testing.T) {
}
func TestEndOfWeek(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfWeek")
expected := time.Date(2022, 2, 19, 23, 59, 59, 999999999, time.Local)
@@ -223,6 +275,8 @@ func TestEndOfWeek(t *testing.T) {
}
func TestBeginOfMonth(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfMonth")
expected := time.Date(2022, 2, 1, 0, 0, 0, 0, time.Local)
@@ -233,6 +287,8 @@ func TestBeginOfMonth(t *testing.T) {
}
func TestEndOfMonth(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfMonth")
expected := time.Date(2022, 2, 28, 23, 59, 59, 999999999, time.Local)
@@ -243,6 +299,8 @@ func TestEndOfMonth(t *testing.T) {
}
func TestBeginOfYear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeginOfYear")
expected := time.Date(2022, 1, 1, 0, 0, 0, 0, time.Local)
@@ -253,6 +311,8 @@ func TestBeginOfYear(t *testing.T) {
}
func TestEndOfYear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfYear")
expected := time.Date(2022, 12, 31, 23, 59, 59, 999999999, time.Local)
@@ -263,6 +323,8 @@ func TestEndOfYear(t *testing.T) {
}
func TestIsLeapYear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEndOfYear")
result1 := IsLeapYear(2000)
@@ -273,6 +335,8 @@ func TestIsLeapYear(t *testing.T) {
}
func TestDayOfYear(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDayOfYear")
date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
result1 := DayOfYear(date1)
@@ -288,7 +352,10 @@ func TestDayOfYear(t *testing.T) {
}
func TestIsWeekend(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsWeekend")
date := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
result := IsWeekend(date)
assert.Equal(true, result)
@@ -300,5 +367,4 @@ func TestIsWeekend(t *testing.T) {
date2 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
result2 := IsWeekend(date2)
assert.Equal(false, result2)
}

View File

@@ -48,6 +48,7 @@ import (
- [HmacSha256](#HmacSha256)
- [HmacSha512](#HmacSha512)
- [Md5String](#Md5String)
- [Md5Byte](#Md5Byte)
- [Md5File](#Md5File)
- [Sha1](#Sha1)
- [Sha256](#Sha256)
@@ -880,6 +881,35 @@ func main() {
}
```
### <span id="Md5Byte">Md5Byte</span>
<p>Return the md5 string of byte slice.</p>
<b>Signature:</b>
```go
func Md5Byte(data []byte) string
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/cryptor"
)
func main() {
md5Str := cryptor.Md5Byte([]byte{'a'})
fmt.Println(md5Str)
// Output:
// 0cc175b9c0f1b6a831c399e269772661
}
```
### <span id="Md5File">Md5File</span>
<p>Get the md5 value of file.</p>

View File

@@ -45,6 +45,7 @@ import (
- [HmacSha256](#HmacSha256)
- [HmacSha512](#HmacSha512)
- [Md5String](#Md5String)
- [Md5Byte](#Md5Byte)
- [Md5File](#Md5File)
- [Sha1](#Sha1)
- [Sha256](#Sha256)
@@ -879,6 +880,35 @@ func main() {
}
```
### <span id="Md5Byte">Md5Byte</span>
<p>获取byte slice的md5至。</p>
<b>函数签名:</b>
```go
func Md5Byte(data []byte) string
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/cryptor"
)
func main() {
md5Str := cryptor.Md5Byte([]byte{'a'})
fmt.Println(md5Str)
// Output:
// 0cc175b9c0f1b6a831c399e269772661
}
```
### <span id="Md5File">Md5File</span>
<p>获取文件md5值。</p>

View File

@@ -42,6 +42,8 @@ import (
- [GetNowDate](#GetNowDate)
- [GetNowTime](#GetNowTime)
- [GetNowDateTime](#GetNowDateTime)
- [GetTodayStartTime](#GetTodayStartTime)
- [GetTodayEndTime](#GetTodayEndTime)
- [GetZeroHourTimestamp](#GetZeroHourTimestamp)
- [GetNightTimestamp](#GetNightTimestamp)
- [FormatTimeToStr](#FormatTimeToStr)
@@ -643,14 +645,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
currentDate := datetime.GetNowDate()
fmt.Println(currentDate)
// Output:
@@ -675,14 +674,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
currentTime := datetime.GetNowTime()
fmt.Println(currentTime) // 15:57:33
// Output:
@@ -707,14 +703,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
current := datetime.GetNowDateTime()
fmt.Println(current)
// Output:
@@ -722,6 +715,64 @@ func main() {
}
```
### <span id="GetTodayStartTime">GetTodayStartTime</span>
<p>Return the start time of today, format: yyyy-mm-dd 00:00:00.</p>
<b>Signature:</b>
```go
func GetTodayStartTime() string
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
startTime := datetime.GetTodayStartTime()
fmt.Println(startTime)
// Output:
// 2023-06-29 00:00:00
}
```
### <span id="GetTodayEndTime">GetTodayEndTime</span>
<p>Return the end time of today, format: yyyy-mm-dd 23:59:59.</p>
<b>Signature:</b>
```go
func GetTodayEndTime() string
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
endTime := datetime.GetTodayEndTime()
fmt.Println(endTime)
// Output:
// 2023-06-29 23:59:59
}
```
### <span id="GetZeroHourTimestamp">GetZeroHourTimestamp</span>
<p>Return timestamp of zero hour (timestamp of 00:00).</p>
@@ -739,14 +790,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
zeroTime := datetime.GetZeroHourTimestamp()
fmt.Println(zeroTime)
// Output:
@@ -771,14 +819,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
nightTime := datetime.GetNightTimestamp()
fmt.Println(nightTime)
// Output:

View File

@@ -41,6 +41,8 @@ import (
- [GetNowDate](#GetNowDate)
- [GetNowTime](#GetNowTime)
- [GetNowDateTime](#GetNowDateTime)
- [GetTodayStartTime](#GetTodayStartTime)
- [GetTodayEndTime](#GetTodayEndTime)
- [GetZeroHourTimestamp](#GetZeroHourTimestamp)
- [GetNightTimestamp](#GetNightTimestamp)
- [FormatTimeToStr](#FormatTimeToStr)
@@ -643,14 +645,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
currentDate := datetime.GetNowDate()
fmt.Println(currentDate)
// Output:
@@ -675,15 +674,12 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
currentTime := datetime.GetNowTime()
fmt.Println(currentTime) // 15:57:33
fmt.Println(currentTime)
// Output:
// 15:57:33
@@ -707,14 +703,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
current := datetime.GetNowDateTime()
fmt.Println(current)
// Output:
@@ -722,6 +715,64 @@ func main() {
}
```
### <span id="GetTodayStartTime">GetTodayStartTime</span>
<p>返回当天开始时间, 格式: yyyy-mm-dd 00:00:00.</p>
<b>函数签名:</b>
```go
func GetTodayStartTime() string
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
startTime := datetime.GetTodayStartTime()
fmt.Println(startTime)
// Output:
// 2023-06-29 00:00:00
}
```
### <span id="GetTodayEndTime">GetTodayEndTime</span>
<p>返回当天结束时间,格式: yyyy-mm-dd 23:59:59.</p>
<b>函数签名:</b>
```go
func GetTodayEndTime() string
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
endTime := datetime.GetTodayEndTime()
fmt.Println(endTime)
// Output:
// 2023-06-29 23:59:59
}
```
### <span id="GetZeroHourTimestamp">GetZeroHourTimestamp</span>
<p>获取零点时间戳(timestamp of 00:00)</p>
@@ -739,14 +790,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
zeroTime := datetime.GetZeroHourTimestamp()
fmt.Println(zeroTime)
// Output:
@@ -771,14 +819,11 @@ package main
import (
"fmt"
"time"
"github.com/duke-git/lancet/v2/datetime"
)
func main() {
now := time.Now()
nightTime := datetime.GetNightTimestamp()
fmt.Println(nightTime)
// Output:

View File

@@ -484,7 +484,7 @@ func main() {
<b>Signature:</b>
```go
func ZipAppendEntry(fpath string, destPath string) error
func ZipAppendEntry(fpath string, destPath string) error
```
<b>Example:</b>
@@ -714,18 +714,30 @@ import (
)
func main() {
fpath := "./test.csv"
fileutil.CreateFile(fpath)
f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
defer f.Close()
data := [][]string{
{"Lili", "22", "female"},
{"Jim", "21", "male"},
}
err := WriteCsvFile("./testdata/test2.csv", data, false)
fmt.Println(err)
err := fileutil.WriteCsvFile(fpath, data, false)
content, _ := ReadCsvFile("./testdata/test2.csv")
if err != nil {
return
}
content, err := fileutil.ReadCsvFile(fpath)
if err != nil {
return
}
fmt.Println(content)
// Output:
// <nil>
// [[Lili 22 female] [Jim 21 male]]
}
```

View File

@@ -714,18 +714,30 @@ import (
)
func main() {
fpath := "./test.csv"
fileutil.CreateFile(fpath)
f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
defer f.Close()
data := [][]string{
{"Lili", "22", "female"},
{"Jim", "21", "male"},
}
err := WriteCsvFile("./testdata/test2.csv", data, false)
fmt.Println(err)
err := fileutil.WriteCsvFile(fpath, data, false)
content, _ := ReadCsvFile("./testdata/test2.csv")
if err != nil {
return
}
content, err := fileutil.ReadCsvFile(fpath)
if err != nil {
return
}
fmt.Println(content)
// Output:
// <nil>
// [[Lili 22 female] [Jim 21 male]]
}
```

View File

@@ -46,6 +46,8 @@ import (
- [Sin](#Sin)
- [Log](#Log)
- [Sum](#Sum)
- [Abs](#Abs)
<div STYLE="page-break-after: always;"></div>
@@ -942,4 +944,40 @@ func main() {
// 3
// 1.1
}
```
### <span id="Abs">Abs</span>
<p>Returns the absolute value of x.</p>
<b>Signature:</b>
```go
func Abs[T constraints.Integer | constraints.Float](x T) T
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/mathutil"
)
func main() {
result1 := Abs(-1)
result2 := Abs(-0.1)
result3 := Abs(float32(0.2))
fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3)
// Output:
// 1
// 0.1
// 0.2
}
```

View File

@@ -46,6 +46,7 @@ import (
- [Sin](#Sin)
- [Log](#Log)
- [Sum](#Sum)
- [Abs](#Abs)
<div STYLE="page-break-after: always;"></div>
@@ -941,3 +942,39 @@ func main() {
// 1.1
}
```
### <span id="Abs">Abs</span>
<p>求绝对值。</p>
<b>函数签名:</b>
```go
func Abs[T constraints.Integer | constraints.Float](x T) T
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/mathutil"
)
func main() {
result1 := Abs(-1)
result2 := Abs(-0.1)
result3 := Abs(float32(0.2))
fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3)
// Output:
// 1
// 0.1
// 0.2
}
```

136
docs/pointer.md Normal file
View File

@@ -0,0 +1,136 @@
# Pointer
pointer contains some util functions to operate go pointer.
<div STYLE="page-break-after: always;"></div>
## Source:
- [https://github.com/duke-git/lancet/blob/main/pointer/pointer.go](https://github.com/duke-git/lancet/blob/main/pointer/pointer.go)
<div STYLE="page-break-after: always;"></div>
## Usage:
```go
import (
"github.com/duke-git/lancet/v2/pointer"
)
```
<div STYLE="page-break-after: always;"></div>
## Index
- [Of](#Of)
- [Unwrap](#Unwrap)
- [ExtractPointer](#ExtractPointer)
<div STYLE="page-break-after: always;"></div>
## Documentation
### <span id="Of">Of</span>
<p>Returns a pointer to the pass value `v`.</p>
<b>Signature:</b>
```go
func Of[T any](v T) *T
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
result1 := pointer.Of(123)
result2 := pointer.Of("abc")
fmt.Println(*result1)
fmt.Println(*result2)
// Output:
// 123
// abc
}
```
### <span id="Unwrap">Unwrap</span>
<p>Returns the value from the pointer.</p>
<b>Signature:</b>
```go
func Unwrap[T any](p *T) T
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
a := 123
b := "abc"
result1 := pointer.Unwrap(&a)
result2 := pointer.Unwrap(&b)
fmt.Println(result1)
fmt.Println(result2)
// Output:
// 123
// abc
}
```
### <span id="ExtractPointer">ExtractPointer</span>
<p>Returns the underlying value by the given interface type</p>
<b>Signature:</b>
```go
func ExtractPointer(value any) any
```
<b>Example:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
a := 1
b := &a
c := &b
d := &c
result := pointer.ExtractPointer(d)
fmt.Println(result)
// Output:
// 1
}
```

136
docs/pointer_zh-CN.md Normal file
View File

@@ -0,0 +1,136 @@
# Pointer
pointer包支持一些指针类型的操作。
<div STYLE="page-break-after: always;"></div>
## 源码:
- [https://github.com/duke-git/lancet/blob/main/pointer/pointer.go](https://github.com/duke-git/lancet/blob/main/pointer/pointer.go)
<div STYLE="page-break-after: always;"></div>
## 用法:
```go
import (
"github.com/duke-git/lancet/v2/pointer"
)
```
<div STYLE="page-break-after: always;"></div>
## 目录
- [Of](#Of)
- [Unwrap](#Unwrap)
- [ExtractPointer](#ExtractPointer)
<div STYLE="page-break-after: always;"></div>
## 文档
### <span id="Of">Of</span>
<p>返回传入参数的指针值。</p>
<b>函数签名:</b>
```go
func Of[T any](v T) *T
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
result1 := pointer.Of(123)
result2 := pointer.Of("abc")
fmt.Println(*result1)
fmt.Println(*result2)
// Output:
// 123
// abc
}
```
### <span id="Unwrap">Unwrap</span>
<p>返回传入指针指向的值。</p>
<b>函数签名:</b>
```go
func Unwrap[T any](p *T) T
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
a := 123
b := "abc"
result1 := pointer.Unwrap(&a)
result2 := pointer.Unwrap(&b)
fmt.Println(result1)
fmt.Println(result2)
// Output:
// 123
// abc
}
```
### <span id="ExtractPointer">ExtractPointer</span>
<p>返回传入interface的底层值。</p>
<b>函数签名:</b>
```go
func ExtractPointer(value any) any
```
<b>示例:</b>
```go
package main
import (
"fmt"
"github.com/duke-git/lancet/v2/pointer"
)
func main() {
a := 1
b := &a
c := &b
d := &c
result := pointer.ExtractPointer(d)
fmt.Println(result)
// Output:
// 1
}
```

View File

@@ -269,7 +269,7 @@ import (
)
func main() {
result := RandUniqueIntSlice(5, 0, 10)
result := random.RandUniqueIntSlice(5, 0, 10)
fmt.Println(result) //[0 4 7 1 5] (random)
}
```

View File

@@ -268,7 +268,7 @@ import (
)
func main() {
result := RandUniqueIntSlice(5, 0, 10)
result := random.RandUniqueIntSlice(5, 0, 10)
fmt.Println(result) //[0 4 7 1 5] (random)
}
```

View File

@@ -34,19 +34,19 @@ import (
<div STYLE="page-break-after: always;"></div>
## Documentation 文档
## 文档
### <span id="IsWindows">IsWindows</span>
<p>检查当前操作系统是否是windows</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func IsWindows() bool
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -64,13 +64,13 @@ func main() {
<p>检查当前操作系统是否是linux</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func IsLinux() bool
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -88,13 +88,13 @@ func main() {
<p>检查当前操作系统是否是macos</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func IsMac() bool
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -112,13 +112,13 @@ func main() {
<p>获取key命名的环境变量的值</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func GetOsEnv(key string) string
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -142,13 +142,13 @@ func main() {
<p>设置由key命名的环境变量的值</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func SetOsEnv(key, value string) error
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -172,13 +172,13 @@ func main() {
<p>删除单个环境变量</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func RemoveOsEnv(key string) error
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -210,13 +210,13 @@ func main() {
<p>获取key命名的环境变量值并与compareEnv进行比较</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
func CompareOsEnv(key, comparedEnv string) bool
```
<b>Example:</b>
<b>示例:</b>
```go
import (
@@ -243,7 +243,7 @@ func main() {
<p>执行shell命令返回命令的stdout和stderr字符串如果出现错误则返回错误。参数`command`是一个完整的命令字符串如ls-alinuxdirwindowsping 127.0.0.1。在linux中使用/bin/bash-c执行命令在windows中使用powershell.exe执行命令。</p>
<b>Signature:</b>
<b>函数签名:</b>
```go
type (
@@ -252,7 +252,7 @@ type (
func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)
```
<b>Example:</b>
<b>示例:</b>
```go
import (

1199
docs/tuple.md Normal file

File diff suppressed because it is too large Load Diff

1199
docs/tuple_zh-CN.md Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -507,7 +507,7 @@ func ReadCsvFile(filepath string) ([][]string, error) {
}
// WriteCsvFile write content to target csv file.
// Play: todo
// Play: https://go.dev/play/p/dAXm58Q5U1o
func WriteCsvFile(filepath string, records [][]string, append bool) error {
flag := os.O_RDWR | os.O_CREATE

View File

@@ -8,6 +8,8 @@ import (
)
func TestIsExist(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsExist")
cases := []string{"./", "./file.go", "./a.txt"}
@@ -20,6 +22,8 @@ func TestIsExist(t *testing.T) {
}
func TestCreateFile(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCreateFile")
f := "./text.txt"
@@ -36,6 +40,8 @@ func TestCreateFile(t *testing.T) {
}
func TestCreateDir(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCreateDir")
pwd, err := os.Getwd()
@@ -57,6 +63,8 @@ func TestCreateDir(t *testing.T) {
}
func TestIsDir(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsDir")
cases := []string{"./", "./a.txt"}
@@ -69,6 +77,8 @@ func TestIsDir(t *testing.T) {
}
func TestRemoveFile(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRemoveFile")
f := "./text.txt"
if !IsExist(f) {

View File

@@ -7,6 +7,8 @@ import (
)
func TestDecimalBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDecimalBytes")
assert.Equal("1KB", DecimalBytes(1000))
@@ -21,6 +23,8 @@ func TestDecimalBytes(t *testing.T) {
}
func TestBinaryBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBinaryBytes")
assert.Equal("1KiB", BinaryBytes(1024))
@@ -30,6 +34,8 @@ func TestBinaryBytes(t *testing.T) {
}
func TestParseDecimalBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestParseDecimalBytes")
cases := map[string]uint64{
@@ -58,6 +64,8 @@ func TestParseDecimalBytes(t *testing.T) {
}
func TestParseBinaryBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestParseBinaryBytes")
cases := map[string]uint64{

View File

@@ -8,6 +8,8 @@ import (
)
func TestComma(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestComma")
assert.Equal("", Comma("", ""))
@@ -29,6 +31,8 @@ func TestComma(t *testing.T) {
}
func TestPretty(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPretty")
cases := []any{
@@ -60,6 +64,8 @@ func TestPretty(t *testing.T) {
}
func TestPrettyToWriter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPrettyToWriter")
type User struct {

View File

@@ -11,6 +11,8 @@ import (
)
func TestAfter(t *testing.T) {
t.Parallel()
arr := []string{"a", "b"}
f := After(len(arr), func(i int) int {
fmt.Println("print done")
@@ -34,6 +36,8 @@ func TestAfter(t *testing.T) {
}
func TestBefore(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBefore")
arr := []string{"a", "b", "c", "d", "e"}
@@ -57,6 +61,8 @@ func TestBefore(t *testing.T) {
}
func TestCurry(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCurry")
add := func(a, b int) int {
@@ -71,6 +77,8 @@ func TestCurry(t *testing.T) {
}
func TestCompose(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCompose")
toUpper := func(strs ...string) string {

View File

@@ -7,6 +7,8 @@ import (
)
func TestWatcher(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestWatcher")
w := NewWatcher()

View File

@@ -12,6 +12,8 @@ import (
)
func TestSliceIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSliceIterator")
// HashNext
@@ -60,6 +62,8 @@ func TestSliceIterator(t *testing.T) {
}
func TestRangeIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRangeIterator")
t.Run("range iterator: ", func(t *testing.T) {
@@ -85,6 +89,8 @@ func TestRangeIterator(t *testing.T) {
}
func TestChannelIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRangeIterator")
iter := FromSlice([]int{1, 2, 3, 4})

View File

@@ -17,6 +17,8 @@ import (
)
func TestMapIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMapIterator")
iter := FromSlice([]int{1, 2, 3, 4})
@@ -28,6 +30,8 @@ func TestMapIterator(t *testing.T) {
}
func TestFilterIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilterIterator")
iter := FromSlice([]int{1, 2, 3, 4})
@@ -39,6 +43,8 @@ func TestFilterIterator(t *testing.T) {
}
func TestJoinIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestJoinIterator")
iter1 := FromSlice([]int{1, 2})
@@ -54,6 +60,8 @@ func TestJoinIterator(t *testing.T) {
}
func TestReduce(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReduce")
iter := FromSlice([]int{1, 2, 3, 4})
@@ -62,6 +70,8 @@ func TestReduce(t *testing.T) {
}
func TestTakeIterator(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTakeIterator")
iter := FromSlice([]int{1, 2, 3, 4, 5})

View File

@@ -9,6 +9,8 @@ import (
)
func TestKeys(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestKeys")
m := map[int]string{
@@ -26,6 +28,8 @@ func TestKeys(t *testing.T) {
}
func TestValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestValues")
m := map[int]string{
@@ -43,6 +47,8 @@ func TestValues(t *testing.T) {
}
func TestKeysBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestKeysBy")
m := map[int]string{
@@ -61,6 +67,8 @@ func TestKeysBy(t *testing.T) {
}
func TestValuesBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestValuesBy")
m := map[int]string{
@@ -88,6 +96,8 @@ func TestValuesBy(t *testing.T) {
}
func TestMerge(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMerge")
m1 := map[int]string{
@@ -110,6 +120,8 @@ func TestMerge(t *testing.T) {
}
func TestForEach(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestForEach")
m := map[string]int{
@@ -129,6 +141,8 @@ func TestForEach(t *testing.T) {
}
func TestFilter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilter")
m := map[string]int{
@@ -151,6 +165,8 @@ func TestFilter(t *testing.T) {
}
func TestFilterByKeys(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilterByKeys")
m := map[string]int{
@@ -170,6 +186,8 @@ func TestFilterByKeys(t *testing.T) {
}
func TestFilterByValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilterByValues")
m := map[string]int{
@@ -189,6 +207,8 @@ func TestFilterByValues(t *testing.T) {
}
func TestOmitBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOmitBy")
m := map[string]int{
@@ -212,6 +232,8 @@ func TestOmitBy(t *testing.T) {
}
func TestOmitByKeys(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOmitByKeys")
m := map[string]int{
@@ -232,6 +254,8 @@ func TestOmitByKeys(t *testing.T) {
}
func TestOmitByValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOmitByValues")
m := map[string]int{
@@ -252,6 +276,8 @@ func TestOmitByValues(t *testing.T) {
}
func TestIntersect(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIntersect")
m1 := map[string]int{
@@ -279,6 +305,8 @@ func TestIntersect(t *testing.T) {
}
func TestMinus(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMinus")
m1 := map[string]int{
@@ -297,6 +325,8 @@ func TestMinus(t *testing.T) {
}
func TestIsDisjoint(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMinus")
m1 := map[string]int{
@@ -319,6 +349,8 @@ func TestIsDisjoint(t *testing.T) {
}
func TestEntries(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEntries")
m := map[string]int{
@@ -339,6 +371,8 @@ func TestEntries(t *testing.T) {
}
func TestFromEntries(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromEntries")
result := FromEntries([]Entry[string, int]{
@@ -354,6 +388,8 @@ func TestFromEntries(t *testing.T) {
}
func TestTransform(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTransform")
m := map[string]int{
@@ -376,6 +412,8 @@ func TestTransform(t *testing.T) {
}
func TestMapKeys(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMapKeys")
m := map[int]string{
@@ -398,6 +436,8 @@ func TestMapKeys(t *testing.T) {
}
func TestMapValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMapKeys")
m := map[int]string{

View File

@@ -21,6 +21,8 @@ type (
)
func TestStructType(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStructType")
src := map[string]interface{}{
@@ -44,6 +46,8 @@ func TestStructType(t *testing.T) {
}
func TestBaseType(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBaseType")
tc := map[string]interface{}{
@@ -90,22 +94,31 @@ func TestBaseType(t *testing.T) {
MapTo(tc["i"], &number)
assert.EqualValues(-1, number)
MapTo(tc["i8"], &number)
assert.EqualValues(-8, number)
MapTo(tc["i16"], &number)
assert.EqualValues(-16, number)
MapTo(tc["i32"], &number)
assert.EqualValues(-32, number)
MapTo(tc["i64"], &number)
assert.EqualValues(-64, number)
MapTo(tc["u"], &number)
assert.EqualValues(1, number)
MapTo(tc["u8"], &number)
assert.EqualValues(8, number)
MapTo(tc["u16"], &number)
assert.EqualValues(16, number)
MapTo(tc["u32"], &number)
assert.EqualValues(32, number)
MapTo(tc["u64"], &number)
assert.EqualValues(64, number)
}

View File

@@ -173,7 +173,7 @@ func MinBy[T any](slice []T, comparator func(T, T) bool) T {
}
// Sum return sum of passed numbers.
// Play: todo
// Play: https://go.dev/play/p/1To2ImAMJA7
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T {
var sum T
@@ -337,7 +337,17 @@ func Sin(radian float64, precision ...int) float64 {
}
// Log returns the logarithm of base n.
// Play: todo
// Play: https://go.dev/play/p/_d4bi8oyhat
func Log(n, base float64) float64 {
return math.Log(n) / math.Log(base)
}
// Abs returns the absolute value of x.
// Play: todo
func Abs[T constraints.Integer | constraints.Float](x T) T {
if x < 0 {
return (-x)
}
return x
}

View File

@@ -389,3 +389,18 @@ func ExampleLog() {
// 2.32
// 3
}
func ExampleAbs() {
result1 := Abs(-1)
result2 := Abs(-0.1)
result3 := Abs(float32(0.2))
fmt.Println(result1)
fmt.Println(result2)
fmt.Println(result3)
// Output:
// 1
// 0.1
// 0.2
}

View File

@@ -8,6 +8,8 @@ import (
)
func TestExponent(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestExponent")
assert.Equal(int64(1), Exponent(10, 0))
@@ -16,6 +18,8 @@ func TestExponent(t *testing.T) {
}
func TestFibonacci(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFibonacci")
assert.Equal(0, Fibonacci(1, 1, 0))
@@ -25,6 +29,8 @@ func TestFibonacci(t *testing.T) {
}
func TestFactorial(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFactorial")
assert.Equal(uint(1), Factorial(0))
@@ -34,6 +40,8 @@ func TestFactorial(t *testing.T) {
}
func TestPercent(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPercent")
assert.EqualValues(50, Percent(1, 2, 2))
@@ -42,6 +50,8 @@ func TestPercent(t *testing.T) {
}
func TestRoundToFloat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRoundToFloat")
assert.Equal(float64(0), RoundToFloat(0, 0))
@@ -53,6 +63,8 @@ func TestRoundToFloat(t *testing.T) {
}
func TestRoundToString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRoundToString")
assert.Equal("0", RoundToString(0, 0))
@@ -63,6 +75,8 @@ func TestRoundToString(t *testing.T) {
}
func TestTruncRound(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTruncRound")
assert.Equal(float64(0), TruncRound(0, 0))
@@ -74,6 +88,8 @@ func TestTruncRound(t *testing.T) {
}
func TestAverage(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAverage")
assert.Equal(0, Average(0, 0))
@@ -84,6 +100,8 @@ func TestAverage(t *testing.T) {
}
func TestSum(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSum")
assert.Equal(1, Sum(0, 1))
@@ -91,6 +109,8 @@ func TestSum(t *testing.T) {
}
func TestMax(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMax")
assert.Equal(0, Max(0, 0))
@@ -102,6 +122,8 @@ func TestMax(t *testing.T) {
}
func TestMaxBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "MaxBy")
res1 := MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
@@ -121,6 +143,8 @@ func TestMaxBy(t *testing.T) {
}
func TestMin(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMin")
assert.Equal(0, Min(0, 0))
@@ -129,6 +153,8 @@ func TestMin(t *testing.T) {
}
func TestMinBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMinBy")
res1 := MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
@@ -148,6 +174,8 @@ func TestMinBy(t *testing.T) {
}
func TestRange(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRange")
result1 := Range(1, 4)
@@ -164,6 +192,8 @@ func TestRange(t *testing.T) {
}
func TestRangeWithStep(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRangeWithStep")
result1 := RangeWithStep(1, 4, 1)
@@ -178,6 +208,8 @@ func TestRangeWithStep(t *testing.T) {
}
func TestAngleToRadian(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAngleToRadian")
result1 := AngleToRadian(45)
@@ -190,6 +222,8 @@ func TestAngleToRadian(t *testing.T) {
}
func TestRadianToAngle(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAngleToRadian")
result1 := RadianToAngle(math.Pi)
@@ -202,6 +236,8 @@ func TestRadianToAngle(t *testing.T) {
}
func TestPointDistance(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPointDistance")
result1 := PointDistance(1, 1, 4, 5)
@@ -210,6 +246,8 @@ func TestPointDistance(t *testing.T) {
}
func TestIsPrime(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsPrime")
assert.Equal(false, IsPrime(-1))
@@ -221,6 +259,8 @@ func TestIsPrime(t *testing.T) {
}
func TestGCD(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGCD")
assert.Equal(1, GCD(1, 1))
@@ -246,6 +286,8 @@ func TestGCD(t *testing.T) {
}
func TestLCM(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLCM")
assert.Equal(1, LCM(1))
@@ -259,6 +301,8 @@ func TestLCM(t *testing.T) {
}
func TestCos(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCos")
assert.EqualValues(1, Cos(0))
@@ -269,6 +313,8 @@ func TestCos(t *testing.T) {
}
func TestSin(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSin")
assert.EqualValues(0, Sin(0))
@@ -279,9 +325,25 @@ func TestSin(t *testing.T) {
}
func TestLog(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLog")
assert.EqualValues(3, Log(8, 2))
assert.EqualValues(3, TruncRound(Log(27, 3), 0))
assert.EqualValues(2.32, TruncRound(Log(5, 2), 2))
}
func TestAbs(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAbs")
assert.Equal(0, Abs(0))
assert.Equal(1, Abs(-1))
assert.Equal(0.1, Abs(-0.1))
assert.Equal(int64(1), Abs(int64(-1)))
assert.Equal(float32(1), Abs(float32(-1)))
}

View File

@@ -126,6 +126,8 @@ func TestHttpDelete(t *testing.T) {
}
func TestConvertMapToQueryString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestConvertMapToQueryString")
var m = map[string]any{
@@ -133,6 +135,7 @@ func TestConvertMapToQueryString(t *testing.T) {
"a": 1,
"b": 2,
}
assert.Equal("a=1&b=2&c=3", ConvertMapToQueryString(m))
}
@@ -163,6 +166,8 @@ func TestParseResponse(t *testing.T) {
}
func TestHttpClient_Get(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHttpClient_Get")
request := &HttpRequest{
@@ -218,6 +223,8 @@ func TestHttpClent_Post(t *testing.T) {
}
func TestStructToUrlValues(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStructToUrlValues")
type TodoQuery struct {

View File

@@ -9,6 +9,8 @@ import (
)
func TestGetInternalIp(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetInternalIp")
internalIp := GetInternalIp()
@@ -17,6 +19,8 @@ func TestGetInternalIp(t *testing.T) {
}
func TestGetRequestPublicIp(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGetPublicIpInfo")
ip := "36.112.24.10"
@@ -50,6 +54,8 @@ func TestGetRequestPublicIp(t *testing.T) {
// }
func TestIsPublicIP(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsPublicIP")
ips := []net.IP{
@@ -69,6 +75,8 @@ func TestIsPublicIP(t *testing.T) {
}
func TestIsInternalIP(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsInternalIP")
ips := []net.IP{
@@ -110,14 +118,9 @@ func TestEncodeUrl(t *testing.T) {
assert.Equal(expected, encodedUrl)
}
// func TestDownloadFile(t *testing.T) {
// assert := internal.NewAssert(t, "TestDownloadFile")
// err := DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
// assert.IsNil(err)
// }
func TestIsPingConnected(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsPingConnected")
// in github action env, this will fail
@@ -129,6 +132,8 @@ func TestIsPingConnected(t *testing.T) {
}
func TestTelnetConnected(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTelnetConnected")
result1 := IsTelnetConnected("bing.com", "80")

View File

@@ -7,19 +7,19 @@ package pointer
import "reflect"
// Of returns a pointer to the value `v`.
// Play: todo
// Play: https://go.dev/play/p/HFd70x4DrMj
func Of[T any](v T) *T {
return &v
}
// Unwrap returns the value from the pointer.
// Play: todo
// Play: https://go.dev/play/p/cgeu3g7cjWb
func Unwrap[T any](p *T) T {
return *p
}
// ExtractPointer returns the underlying value by the given interface type
// Play: todo
// Play: https://go.dev/play/p/D7HFjeWU2ZP
func ExtractPointer(value any) any {
t := reflect.TypeOf(value)
v := reflect.ValueOf(value)

View File

@@ -7,6 +7,8 @@ import (
)
func TestOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOf")
result1 := Of(123)
@@ -17,6 +19,8 @@ func TestOf(t *testing.T) {
}
func TestUnwrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnwrap")
a := 123
@@ -27,6 +31,8 @@ func TestUnwrap(t *testing.T) {
}
func TestExtractPointer(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestExtractPointer")
a := 1

View File

@@ -9,6 +9,8 @@ import (
)
func TestResolve(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestResolve")
p := Resolve("abc")
@@ -18,6 +20,8 @@ func TestResolve(t *testing.T) {
}
func TestReject(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReject")
err := errors.New("error")
@@ -28,6 +32,8 @@ func TestReject(t *testing.T) {
}
func TestThen(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestThen")
p1 := New(func(resolve func(string), reject func(error)) {
@@ -48,6 +54,8 @@ func TestThen(t *testing.T) {
}
func TestPromise_Then(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPromise_Then")
p1 := New(func(resolve func(int), reject func(error)) {
@@ -68,6 +76,8 @@ func TestPromise_Then(t *testing.T) {
}
func TestCatch(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCatch")
p1 := New(func(resolve func(string), reject func(error)) {
@@ -93,6 +103,8 @@ func TestCatch(t *testing.T) {
}
func TestPromise_Catch(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPromise_Catch")
p1 := New(func(resolve func(string), reject func(error)) {
@@ -118,6 +130,8 @@ func TestPromise_Catch(t *testing.T) {
}
func TestAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPromise_All")
t.Run("AllPromisesFullfilled", func(_ *testing.T) {
@@ -180,7 +194,6 @@ func TestAll(t *testing.T) {
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
})
}
@@ -227,7 +240,6 @@ func TestAny(t *testing.T) {
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
})
}
@@ -275,7 +287,6 @@ func TestRace(t *testing.T) {
val, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
assert.Equal("", val)
})
@@ -296,7 +307,6 @@ func TestRace(t *testing.T) {
_, err := p.Await()
assert.IsNotNil(err)
// assert.Equal("error1", err.Error())
})
}

View File

@@ -116,7 +116,7 @@ func UUIdV4() (string, error) {
}
// RandUniqueIntSlice generate a slice of random int of length n that do not repeat.
// Play: todo
// Play: https://go.dev/play/p/uBkRSOz73Ec
func RandUniqueIntSlice(n, min, max int) []int {
if min > max {
return []int{}

View File

@@ -9,6 +9,8 @@ import (
)
func TestRandString(t *testing.T) {
t.Parallel()
pattern := `^[a-zA-Z]+$`
reg := regexp.MustCompile(pattern)
@@ -20,6 +22,8 @@ func TestRandString(t *testing.T) {
}
func TestRandUpper(t *testing.T) {
t.Parallel()
pattern := `^[A-Z]+$`
reg := regexp.MustCompile(pattern)
@@ -31,6 +35,8 @@ func TestRandUpper(t *testing.T) {
}
func TestRandLower(t *testing.T) {
t.Parallel()
pattern := `^[a-z]+$`
reg := regexp.MustCompile(pattern)
@@ -42,6 +48,8 @@ func TestRandLower(t *testing.T) {
}
func TestRandNumeral(t *testing.T) {
t.Parallel()
pattern := `^[0-9]+$`
reg := regexp.MustCompile(pattern)
@@ -53,6 +61,8 @@ func TestRandNumeral(t *testing.T) {
}
func TestRandNumeralOrLetter(t *testing.T) {
t.Parallel()
pattern := `^[0-9a-zA-Z]+$`
reg := regexp.MustCompile(pattern)
@@ -64,6 +74,8 @@ func TestRandNumeralOrLetter(t *testing.T) {
}
func TestRandInt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRandInt")
r1 := RandInt(1, 10)
@@ -79,6 +91,8 @@ func TestRandInt(t *testing.T) {
}
func TestRandBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRandBytes")
randBytes := RandBytes(4)
@@ -93,6 +107,8 @@ func TestRandBytes(t *testing.T) {
}
func TestUUIdV4(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUUIdV4")
uuid, err := UUIdV4()
@@ -105,6 +121,8 @@ func TestUUIdV4(t *testing.T) {
}
func TestRandUniqueIntSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRandUniqueIntSlice")
r1 := RandUniqueIntSlice(5, 0, 9)

View File

@@ -10,6 +10,8 @@ import (
)
func TestRetryFailed(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRetryFailed")
var number int
@@ -25,6 +27,8 @@ func TestRetryFailed(t *testing.T) {
}
func TestRetrySucceeded(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRetrySucceeded")
var number int
@@ -43,6 +47,8 @@ func TestRetrySucceeded(t *testing.T) {
}
func TestSetRetryTimes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSetRetryTimes")
var number int
@@ -58,6 +64,8 @@ func TestSetRetryTimes(t *testing.T) {
}
func TestCancelRetry(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCancelRetry")
ctx, cancel := context.WithCancel(context.TODO())

View File

@@ -10,6 +10,8 @@ import (
)
func TestContain(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContain")
assert.Equal(true, Contain([]string{"a", "b", "c"}, "a"))
@@ -21,6 +23,8 @@ func TestContain(t *testing.T) {
}
func TestContainBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainBy")
type foo struct {
@@ -43,6 +47,8 @@ func TestContainBy(t *testing.T) {
}
func TestContainSubSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainSubSlice")
assert.Equal(true, ContainSubSlice([]string{"a", "a", "b", "c"}, []string{"a", "a"}))
assert.Equal(false, ContainSubSlice([]string{"a", "a", "b", "c"}, []string{"a", "d"}))
@@ -51,6 +57,8 @@ func TestContainSubSlice(t *testing.T) {
}
func TestChunk(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestChunk")
arr := []string{"a", "b", "c", "d", "e"}
@@ -79,6 +87,8 @@ func TestChunk(t *testing.T) {
}
func TestCompact(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TesCompact")
assert.Equal([]int{}, Compact([]int{0}))
@@ -90,6 +100,8 @@ func TestCompact(t *testing.T) {
}
func TestConcat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "Concat")
assert.Equal([]int{1, 2, 3, 4, 5}, Concat([]int{1, 2, 3}, []int{4, 5}))
@@ -97,6 +109,8 @@ func TestConcat(t *testing.T) {
}
func TestEqual(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEqual")
slice1 := []int{1, 2, 3}
@@ -115,6 +129,8 @@ func FuzzEqual(f *testing.F) {
}
func TestEqualWith(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEqualWith")
slice1 := []int{1, 2, 3}
@@ -128,6 +144,8 @@ func TestEqualWith(t *testing.T) {
}
func TestEvery(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestEvery")
nums := []int{1, 2, 3, 5}
@@ -139,6 +157,8 @@ func TestEvery(t *testing.T) {
}
func TestNone(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestNone")
nums := []int{1, 2, 3, 5}
@@ -150,6 +170,8 @@ func TestNone(t *testing.T) {
}
func TestSome(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSome")
nums := []int{1, 2, 3, 5}
@@ -161,6 +183,8 @@ func TestSome(t *testing.T) {
}
func TestFilter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilter")
nums := []int{1, 2, 3, 4, 5}
@@ -193,6 +217,8 @@ func TestFilter(t *testing.T) {
}
func TestGroupBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestGroupBy")
nums := []int{1, 2, 3, 4, 5, 6}
@@ -206,6 +232,8 @@ func TestGroupBy(t *testing.T) {
}
func TestGroupWith(t *testing.T) {
t.Parallel()
nums := []float64{6.1, 4.2, 6.3}
floor := func(num float64) float64 {
return math.Floor(num)
@@ -220,6 +248,8 @@ func TestGroupWith(t *testing.T) {
}
func TestCount(t *testing.T) {
t.Parallel()
numbers := []int{1, 2, 3, 3, 5, 6}
assert := internal.NewAssert(t, "TestCountBy")
@@ -229,6 +259,8 @@ func TestCount(t *testing.T) {
}
func TestCountBy(t *testing.T) {
t.Parallel()
nums := []int{1, 2, 3, 4, 5, 6}
evenFunc := func(i, num int) bool {
return (num % 2) == 0
@@ -239,6 +271,8 @@ func TestCountBy(t *testing.T) {
}
func TestFind(t *testing.T) {
t.Parallel()
nums := []int{1, 2, 3, 4, 5}
even := func(i, num int) bool {
return num%2 == 0
@@ -251,6 +285,8 @@ func TestFind(t *testing.T) {
}
func TestFindBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFindBy")
nums := []int{1, 2, 3, 4, 5}
@@ -269,6 +305,8 @@ func TestFindBy(t *testing.T) {
}
func TestFindLastBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFindLastBy")
nums := []int{1, 2, 3, 4, 5}
@@ -289,6 +327,8 @@ func TestFindLastBy(t *testing.T) {
}
func TestFindLast(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFindLast")
nums := []int{1, 2, 3, 4, 5}
@@ -304,6 +344,8 @@ func TestFindLast(t *testing.T) {
}
func TestFindFoundNothing(t *testing.T) {
t.Parallel()
nums := []int{1, 1, 1, 1, 1, 1}
findFunc := func(i, num int) bool {
return num > 1
@@ -315,6 +357,8 @@ func TestFindFoundNothing(t *testing.T) {
}
func TestFlatten(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFlatten")
input := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
@@ -324,6 +368,8 @@ func TestFlatten(t *testing.T) {
}
func TestFlattenDeep(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFlattenDeep")
input := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
@@ -333,6 +379,8 @@ func TestFlattenDeep(t *testing.T) {
}
func TestForEach(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestForEach")
numbers := []int{1, 2, 3, 4, 5}
@@ -348,6 +396,8 @@ func TestForEach(t *testing.T) {
}
func TestForEachWithBreak(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestForEach")
numbers := []int{1, 2, 3, 4, 5}
@@ -366,6 +416,8 @@ func TestForEachWithBreak(t *testing.T) {
}
func TestMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMap")
nums := []int{1, 2, 3, 4}
@@ -398,6 +450,8 @@ func TestMap(t *testing.T) {
}
func TestFilterMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFilterMap")
nums := []int{1, 2, 3, 4, 5}
@@ -415,6 +469,8 @@ func TestFilterMap(t *testing.T) {
}
func TestFlatMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFlatMap")
nums := []int{1, 2, 3, 4}
@@ -428,6 +484,8 @@ func TestFlatMap(t *testing.T) {
}
func TestReduce(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReduce")
cases := [][]int{
@@ -448,6 +506,8 @@ func TestReduce(t *testing.T) {
}
func TestReduceBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReduceBy")
result1 := ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
@@ -464,6 +524,8 @@ func TestReduceBy(t *testing.T) {
}
func TestReduceRight(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReduceRight")
result := ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
@@ -474,6 +536,8 @@ func TestReduceRight(t *testing.T) {
}
func TestIntSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIntSlice")
var nums []any
@@ -483,6 +547,8 @@ func TestIntSlice(t *testing.T) {
}
func TestStringSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStringSlice")
var strs []any
@@ -492,6 +558,8 @@ func TestStringSlice(t *testing.T) {
}
func TestInterfaceSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestInterfaceSlice")
strs := []string{"a", "b", "c"}
@@ -501,6 +569,8 @@ func TestInterfaceSlice(t *testing.T) {
}
func TestDeleteAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDeleteAt")
assert.Equal([]string{"a", "b", "c"}, DeleteAt([]string{"a", "b", "c"}, -1))
@@ -518,6 +588,8 @@ func TestDeleteAt(t *testing.T) {
}
func TestDrop(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDrop")
assert.Equal([]int{}, Drop([]int{}, 0))
@@ -533,6 +605,8 @@ func TestDrop(t *testing.T) {
}
func TestDropRight(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDropRight")
assert.Equal([]int{}, DropRight([]int{}, 0))
@@ -548,6 +622,8 @@ func TestDropRight(t *testing.T) {
}
func TestDropWhile(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDropWhile")
numbers := []int{1, 2, 3, 4, 5}
@@ -569,6 +645,8 @@ func TestDropWhile(t *testing.T) {
}
func TestDropRightWhile(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDropRightWhile")
numbers := []int{1, 2, 3, 4, 5}
@@ -590,6 +668,8 @@ func TestDropRightWhile(t *testing.T) {
}
func TestInsertAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestInsertAt")
strs := []string{"a", "b", "c"}
@@ -604,6 +684,8 @@ func TestInsertAt(t *testing.T) {
}
func TestUpdateAt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUpdateAt")
assert.Equal([]string{"a", "b", "c"}, UpdateAt([]string{"a", "b", "c"}, -1, "1"))
@@ -613,6 +695,8 @@ func TestUpdateAt(t *testing.T) {
}
func TestUnique(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnique")
assert.Equal([]int{1, 2, 3}, Unique([]int{1, 2, 2, 3}))
@@ -620,6 +704,8 @@ func TestUnique(t *testing.T) {
}
func TestUniqueBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUniqueBy")
actual := UniqueBy([]int{1, 2, 3, 4, 5, 6}, func(val int) int {
@@ -629,6 +715,8 @@ func TestUniqueBy(t *testing.T) {
}
func TestUnion(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnion")
s1 := []int{1, 3, 4, 6}
@@ -641,6 +729,8 @@ func TestUnion(t *testing.T) {
}
func TestUnionBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnionBy")
testFunc := func(i int) int {
@@ -652,6 +742,8 @@ func TestUnionBy(t *testing.T) {
}
func TestMerge(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestMerge")
s1 := []int{1, 2, 3, 4}
@@ -664,6 +756,8 @@ func TestMerge(t *testing.T) {
}
func TestIntersection(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIntersection")
s1 := []int{1, 2, 2, 3}
@@ -690,6 +784,8 @@ func TestIntersection(t *testing.T) {
}
func TestSymmetricDifference(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSymmetricDifference")
s1 := []int{1, 2, 3}
@@ -702,6 +798,8 @@ func TestSymmetricDifference(t *testing.T) {
}
func TestReverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReverse")
s1 := []int{1, 2, 3, 4, 5}
@@ -714,6 +812,8 @@ func TestReverse(t *testing.T) {
}
func TestDifference(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDifference")
s1 := []int{1, 2, 3, 4, 5}
@@ -723,6 +823,8 @@ func TestDifference(t *testing.T) {
}
func TestDifferenceWith(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDifferenceWith")
s1 := []int{1, 2, 3, 4, 5}
@@ -735,6 +837,8 @@ func TestDifferenceWith(t *testing.T) {
}
func TestDifferenceBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestDifferenceBy")
s1 := []int{1, 2, 3, 4, 5} // after add one: 2 3 4 5 6
@@ -747,6 +851,8 @@ func TestDifferenceBy(t *testing.T) {
}
func TestIsAscending(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsAscending")
assert.Equal(true, IsAscending([]int{1, 2, 3, 4, 5}))
@@ -755,6 +861,8 @@ func TestIsAscending(t *testing.T) {
}
func TestIsDescending(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsDescending")
assert.Equal(true, IsDescending([]int{5, 4, 3, 2, 1}))
@@ -763,6 +871,8 @@ func TestIsDescending(t *testing.T) {
}
func TestIsSorted(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsSorted")
assert.Equal(true, IsSorted([]int{5, 4, 3, 2, 1}))
@@ -771,6 +881,8 @@ func TestIsSorted(t *testing.T) {
}
func TestIsSortedByKey(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsSortedByKey")
assert.Equal(true, IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
@@ -787,6 +899,8 @@ func TestIsSortedByKey(t *testing.T) {
}
func TestSort(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSort")
numbers := []int{1, 4, 3, 2, 5}
@@ -807,6 +921,8 @@ func TestSort(t *testing.T) {
}
func TestSortBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSortBy")
numbers := []int{1, 4, 3, 2, 5}
@@ -836,6 +952,8 @@ func TestSortBy(t *testing.T) {
}
func TestSortByFielDesc(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSortByFielDesc")
type student struct {
@@ -862,6 +980,8 @@ func TestSortByFielDesc(t *testing.T) {
}
func TestSortByFieldAsc(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSortByFieldAsc")
type student struct {
@@ -888,12 +1008,16 @@ func TestSortByFieldAsc(t *testing.T) {
}
func TestWithout(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestWithout")
assert.Equal([]int{3, 4, 5}, Without([]int{1, 2, 3, 4, 5}, 1, 2))
assert.Equal([]int{1, 2, 3, 4, 5}, Without([]int{1, 2, 3, 4, 5}))
}
func TestShuffle(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestShuffle")
numbers := []int{1, 2, 3, 4, 5}
@@ -903,6 +1027,8 @@ func TestShuffle(t *testing.T) {
}
func TestIndexOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOf")
arr := []string{"a", "a", "b", "c"}
@@ -942,6 +1068,8 @@ func TestIndexOf(t *testing.T) {
}
func TestLastIndexOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLastIndexOf")
arr := []string{"a", "b", "b", "c"}
@@ -951,6 +1079,8 @@ func TestLastIndexOf(t *testing.T) {
}
func TestToSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToSlice")
str1 := "a"
@@ -960,6 +1090,8 @@ func TestToSlice(t *testing.T) {
}
func TestToSlicePointer(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestToSlicePointer")
str1 := "a"
@@ -969,6 +1101,8 @@ func TestToSlicePointer(t *testing.T) {
}
func TestAppendIfAbsent(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAppendIfAbsent")
str1 := []string{"a", "b"}
@@ -977,6 +1111,8 @@ func TestAppendIfAbsent(t *testing.T) {
}
func TestReplace(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReplace")
strs := []string{"a", "b", "a", "c", "d", "a"}
@@ -995,6 +1131,8 @@ func TestReplace(t *testing.T) {
}
func TestReplaceAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReplaceAll")
strs := []string{"a", "b", "a", "c", "d", "a"}
@@ -1004,6 +1142,8 @@ func TestReplaceAll(t *testing.T) {
}
func TestKeyBy(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestKeyBy")
result := KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
@@ -1014,6 +1154,8 @@ func TestKeyBy(t *testing.T) {
}
func TestRepeat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRepeat")
assert.Equal([]string{}, Repeat("a", 0))

View File

@@ -8,6 +8,8 @@ import (
)
func TestOf(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromSlice")
stream := Of(1, 2, 3)
@@ -15,6 +17,8 @@ func TestOf(t *testing.T) {
}
func TestGenerate(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromSlice")
n := 0
@@ -33,14 +37,17 @@ func TestGenerate(t *testing.T) {
}
func TestFromSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromSlice")
stream := FromSlice([]int{1, 2, 3})
assert.Equal([]int{1, 2, 3}, stream.ToSlice())
}
func TestFromChannel(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromChannel")
ch := make(chan int)
@@ -57,6 +64,8 @@ func TestFromChannel(t *testing.T) {
}
func TestFromRange(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestFromRange")
s1 := FromRange(1, 5, 1)
@@ -67,6 +76,8 @@ func TestFromRange(t *testing.T) {
}
func TestStream_Distinct(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStream_Distinct")
nums := FromSlice([]int{1, 2, 2, 3, 3, 3})
@@ -99,6 +110,8 @@ func TestStream_Distinct(t *testing.T) {
}
func TestStream_Filter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStream_Filter")
stream := FromSlice([]int{1, 2, 3, 4, 5})

View File

@@ -1,12 +1,15 @@
package structs
import (
"github.com/duke-git/lancet/v2/internal"
"reflect"
"testing"
"github.com/duke-git/lancet/v2/internal"
)
func TestField_Tag(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_Tag")
type Parent struct {
@@ -17,11 +20,14 @@ func TestField_Tag(t *testing.T) {
s := New(p1)
n, _ := s.Field("Name")
tag := n.Tag()
assert.Equal("name", tag.Name)
assert.Equal(true, tag.HasOption("omitempty"))
}
func TestField_Value(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_Value")
type Parent struct {
@@ -36,7 +42,10 @@ func TestField_Value(t *testing.T) {
}
func TestField_IsEmbedded(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_IsEmbedded")
type Parent struct {
Name string
}
@@ -51,11 +60,14 @@ func TestField_IsEmbedded(t *testing.T) {
s := New(c1)
n, _ := s.Field("Name")
a, _ := s.Field("Age")
assert.Equal(true, n.IsEmbedded())
assert.Equal(false, a.IsEmbedded())
}
func TestField_IsExported(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_IsEmbedded")
type Parent struct {
@@ -66,11 +78,14 @@ func TestField_IsExported(t *testing.T) {
s := New(p1)
n, _ := s.Field("Name")
a, _ := s.Field("age")
assert.Equal(true, n.IsExported())
assert.Equal(false, a.IsExported())
}
func TestField_IsZero(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_IsZero")
type Parent struct {
@@ -81,11 +96,14 @@ func TestField_IsZero(t *testing.T) {
s := New(p1)
n, _ := s.Field("Name")
a, _ := s.Field("Age")
assert.Equal(true, n.IsZero())
assert.Equal(false, a.IsZero())
}
func TestField_Name(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_Name")
type Parent struct {
@@ -102,6 +120,8 @@ func TestField_Name(t *testing.T) {
}
func TestField_Kind(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_Kind")
type Parent struct {
@@ -118,6 +138,8 @@ func TestField_Kind(t *testing.T) {
}
func TestField_IsSlice(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_IsSlice")
type Parent struct {
@@ -133,6 +155,8 @@ func TestField_IsSlice(t *testing.T) {
}
func TestField_MapValue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestField_MapValue")
t.Run("nested struct", func(t *testing.T) {

View File

@@ -8,8 +8,9 @@ import (
)
func TestStruct_ToMap(t *testing.T) {
assert := internal.NewAssert(t, "TestStruct_ToMap")
t.Parallel()
assert := internal.NewAssert(t, "TestStruct_ToMap")
t.Run("invalid struct", func(t *testing.T) {
m, _ := ToMap(1)
var expected map[string]any
@@ -65,6 +66,8 @@ func TestStruct_ToMap(t *testing.T) {
}
func TestStruct_Fields(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStruct_Fields")
type Parent struct {
@@ -91,6 +94,8 @@ func TestStruct_Fields(t *testing.T) {
}
func TestStruct_Field(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStruct_Field")
type Parent struct {
@@ -109,6 +114,7 @@ func TestStruct_Field(t *testing.T) {
s := New(p1)
a, ok := s.Field("A")
assert.Equal(true, ok)
assert.Equal(reflect.String, a.Kind())
assert.Equal("1", a.Value())
@@ -118,6 +124,8 @@ func TestStruct_Field(t *testing.T) {
}
func TestStruct_IsStruct(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStruct_Field")
type Test1 struct{}

View File

@@ -561,7 +561,7 @@ var (
// RemoveWhiteSpace remove whitespace characters from a string.
// when set repalceAll is true removes all whitespace, false only replaces consecutive whitespace characters with one space.
// Play: todo
// Play: https://go.dev/play/p/HzLC9vsTwkf
func RemoveWhiteSpace(str string, repalceAll bool) string {
if repalceAll && str != "" {
return strings.Join(strings.Fields(str), "")

View File

@@ -8,6 +8,8 @@ import (
)
func TestCamelCase(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCamelCase")
cases := map[string]string{
@@ -27,6 +29,8 @@ func TestCamelCase(t *testing.T) {
}
func TestCapitalize(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestCapitalize")
cases := map[string]string{
@@ -46,6 +50,8 @@ func TestCapitalize(t *testing.T) {
}
func TestKebabCase(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestKebabCase")
cases := map[string]string{
@@ -69,6 +75,8 @@ func TestKebabCase(t *testing.T) {
}
func TestUpperKebabCase(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUpperKebabCase")
cases := map[string]string{
@@ -92,6 +100,8 @@ func TestUpperKebabCase(t *testing.T) {
}
func TestSnakeCase(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSnakeCase")
cases := map[string]string{
@@ -115,6 +125,8 @@ func TestSnakeCase(t *testing.T) {
}
func TestUpperSnakeCase(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUpperSnakeCase")
cases := map[string]string{
@@ -138,6 +150,8 @@ func TestUpperSnakeCase(t *testing.T) {
}
func TestUpperFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLowerFirst")
cases := map[string]string{
@@ -154,6 +168,8 @@ func TestUpperFirst(t *testing.T) {
}
func TestLowerFirst(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestLowerFirst")
cases := map[string]string{
@@ -170,6 +186,8 @@ func TestLowerFirst(t *testing.T) {
}
func TestPad(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPad")
assert.Equal("a ", Pad("a", 2, ""))
@@ -192,6 +210,8 @@ func TestPadEnd(t *testing.T) {
}
func TestPadStart(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestPadStart")
assert.Equal("a", PadStart("a", 1, "b"))
@@ -204,6 +224,8 @@ func TestPadStart(t *testing.T) {
}
func TestBefore(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBefore")
assert.Equal("lancet", Before("lancet", ""))
@@ -213,6 +235,8 @@ func TestBefore(t *testing.T) {
}
func TestBeforeLast(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBeforeLast")
assert.Equal("lancet", BeforeLast("lancet", ""))
@@ -223,6 +247,8 @@ func TestBeforeLast(t *testing.T) {
}
func TestAfter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAfter")
assert.Equal("lancet", After("lancet", ""))
@@ -232,6 +258,8 @@ func TestAfter(t *testing.T) {
}
func TestAfterLast(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestAfterLast")
assert.Equal("lancet", AfterLast("lancet", ""))
@@ -243,6 +271,8 @@ func TestAfterLast(t *testing.T) {
}
func TestIsString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsString")
assert.Equal(true, IsString("lancet"))
@@ -253,6 +283,8 @@ func TestIsString(t *testing.T) {
}
func TestReverse(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReverse")
assert.Equal("cba", Reverse("abc"))
@@ -260,6 +292,8 @@ func TestReverse(t *testing.T) {
}
func TestWrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestWrap")
assert.Equal("ab", Wrap("ab", ""))
@@ -270,6 +304,8 @@ func TestWrap(t *testing.T) {
}
func TestUnwrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnwrap")
assert.Equal("", Unwrap("", "*"))
@@ -288,6 +324,8 @@ func TestUnwrap(t *testing.T) {
}
func TestSplitEx(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSplitEx")
assert.Equal([]string{}, SplitEx(" a b c ", "", true))
@@ -300,6 +338,8 @@ func TestSplitEx(t *testing.T) {
}
func TestSubstring(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSubstring")
assert.Equal("bcd", Substring("abcde", 1, 3))
@@ -311,6 +351,8 @@ func TestSubstring(t *testing.T) {
}
func TestSplitWords(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSplitWords")
cases := map[string][]string{
@@ -327,6 +369,8 @@ func TestSplitWords(t *testing.T) {
}
func TestWordCount(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestSplitWords")
cases := map[string]int{
@@ -343,6 +387,8 @@ func TestWordCount(t *testing.T) {
}
func TestRemoveNonPrintable(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestRemoveNonPrintable")
assert.Equal("hello world", RemoveNonPrintable("hello\u00a0 \u200bworld\n"))
@@ -350,47 +396,67 @@ func TestRemoveNonPrintable(t *testing.T) {
}
func TestStringToBytes(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestStringToBytes")
str := "abc"
bytes := StringToBytes(str)
assert.Equal(reflect.DeepEqual(bytes, []byte{'a', 'b', 'c'}), true)
}
func TestBytesToString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestBytesToString")
bytes := []byte{'a', 'b', 'c'}
str := BytesToString(bytes)
assert.Equal(str == "abc", true)
}
func TestIsBlank(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsBlank")
assert.Equal(IsBlank(""), true)
assert.Equal(IsBlank("\t\v\f\n"), true)
assert.Equal(IsBlank(" 中文"), false)
}
func TestHasPrefixAny(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHasPrefixAny")
str := "foo bar"
prefixes := []string{"fo", "xyz", "hello"}
notMatches := []string{"oom", "world"}
assert.Equal(HasPrefixAny(str, prefixes), true)
assert.Equal(HasPrefixAny(str, notMatches), false)
}
func TestHasSuffixAny(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestHasSuffixAny")
str := "foo bar"
suffixes := []string{"bar", "xyz", "hello"}
notMatches := []string{"oom", "world"}
assert.Equal(HasSuffixAny(str, suffixes), true)
assert.Equal(HasSuffixAny(str, notMatches), false)
}
func TestIndexOffset(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIndexOffset")
str := "foo bar hello world"
assert.Equal(IndexOffset(str, "o", 5), 12)
assert.Equal(IndexOffset(str, "o", 0), 1)
assert.Equal(IndexOffset(str, "d", len(str)-1), len(str)-1)
@@ -399,6 +465,8 @@ func TestIndexOffset(t *testing.T) {
}
func TestReplaceWithMap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestReplaceWithMap")
str := "ac ab ab ac"
@@ -412,6 +480,8 @@ func TestReplaceWithMap(t *testing.T) {
}
func TestTrim(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTrim")
str1 := "$ ab cd $ "
@@ -422,6 +492,8 @@ func TestTrim(t *testing.T) {
}
func TestSplitAndTrim(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTrim")
str := " a,b, c,d,$1 "
@@ -434,6 +506,8 @@ func TestSplitAndTrim(t *testing.T) {
}
func TestHideString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTrim")
str := "13242658976"
@@ -452,6 +526,8 @@ func TestHideString(t *testing.T) {
}
func TestContainsAll(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainsAll")
assert.Equal(true, ContainsAll("hello world", []string{"hello", "world"}))
@@ -460,6 +536,8 @@ func TestContainsAll(t *testing.T) {
}
func TestContainsAny(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainsAny")
assert.Equal(true, ContainsAny("hello world", []string{"hello", "world"}))

View File

@@ -8,6 +8,8 @@ import (
)
func TestOsDetection(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOsJudgment")
osType, _, _ := ExecCommand("echo $OSTYPE")
@@ -20,6 +22,8 @@ func TestOsDetection(t *testing.T) {
}
func TestOsEnvOperation(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestOsEnvOperation")
envNotExist := GetOsEnv("foo")
@@ -44,6 +48,8 @@ func TestOsEnvOperation(t *testing.T) {
}
func TestExecCommand(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestExecCommand")
// linux or mac
@@ -79,6 +85,8 @@ func TestExecCommand(t *testing.T) {
// }
func TestGetOsBits(t *testing.T) {
t.Parallel()
osBits := GetOsBits()
switch osBits {
case 32, 64:

641
tuple/tuple.go Normal file
View File

@@ -0,0 +1,641 @@
// Copyright 2023 dudaodong@gmail.com. All rights reserved.
// Use of this source code is governed by MIT license
// Package tuple implements tuple data type and some operations on it.
package tuple
import "github.com/duke-git/lancet/v2/mathutil"
// Tuple2 represents a 2 elemnets tuple
type Tuple2[A any, B any] struct {
FieldA A
FieldB B
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple2[A, B]) Unbox() (A, B) {
return t.FieldA, t.FieldB
}
// NewTuple2 creates a 2 elemnets tuple from a list of values.
// Play: todo
func NewTuple2[A any, B any](a A, b B) Tuple2[A, B] {
return Tuple2[A, B]{FieldA: a, FieldB: b}
}
// Zip2 create a slice of Tuple2, whose elements are correspond to the given slice elements.
// Play: todo
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B] {
size := mathutil.Max(len(a), len(b))
tuples := make([]Tuple2[A, B], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
tuples[i] = Tuple2[A, B]{FieldA: v1, FieldB: v2}
}
return tuples
}
// Unzip2 creates a group of slice from a slice of Tuple2.
// Play: todo
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
}
return r1, r2
}
// Tuple3 represents a 3 elemnets tuple
type Tuple3[A any, B any, C any] struct {
FieldA A
FieldB B
FieldC C
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple3[A, B, C]) Unbox() (A, B, C) {
return t.FieldA, t.FieldB, t.FieldC
}
// NewTuple3 creates a 3 elemnets tuple from a list of values.
// Play: todo
func NewTuple3[A any, B any, C any](a A, b B, c C) Tuple3[A, B, C] {
return Tuple3[A, B, C]{FieldA: a, FieldB: b, FieldC: c}
}
// Zip3 create a slice of Tuple3, whose elements are correspond to the given slice elements.
// Play: todo
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C] {
size := mathutil.Max(len(a), len(b), len(c))
tuples := make([]Tuple3[A, B, C], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
tuples[i] = Tuple3[A, B, C]{FieldA: v1, FieldB: v2, FieldC: v3}
}
return tuples
}
// Unzip3 creates a group of slice from a slice of Tuple3.
// Play: todo
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
}
return r1, r2, r3
}
// Tuple4 represents a 4 elemnets tuple
type Tuple4[A any, B any, C any, D any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD
}
// NewTuple4 creates a 4 elemnets tuple from a list of values.
// Play: todo
func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D] {
return Tuple4[A, B, C, D]{FieldA: a, FieldB: b, FieldC: c, FieldD: d}
}
// Zip4 create a slice of Tuple4, whose elements are correspond to the given slice elements.
// Play: todo
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D] {
size := mathutil.Max(len(a), len(b), len(c), len(d))
tuples := make([]Tuple4[A, B, C, D], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
v4, _ := getByIndex(d, i)
tuples[i] = Tuple4[A, B, C, D]{FieldA: v1, FieldB: v2, FieldC: v3, FieldD: v4}
}
return tuples
}
// Unzip4 creates a group of slice from a slice of Tuple4.
// Play: todo
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
}
return r1, r2, r3, r4
}
// Tuple5 represents a 5 elemnets tuple
type Tuple5[A any, B any, C any, D any, E any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE
}
// NewTuple5 creates a 5 elemnets tuple from a list of values.
// Play: todo
func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E] {
return Tuple5[A, B, C, D, E]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e}
}
// Zip5 create a slice of Tuple5, whose elements are correspond to the given slice elements.
// Play: todo
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e))
tuples := make([]Tuple5[A, B, C, D, E], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
v4, _ := getByIndex(d, i)
v5, _ := getByIndex(e, i)
tuples[i] = Tuple5[A, B, C, D, E]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5}
}
return tuples
}
// Unzip5 creates a group of slice from a slice of Tuple5.
// Play: todo
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
}
return r1, r2, r3, r4, r5
}
// Tuple6 represents a 6 elemnets tuple
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
FieldF F
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF
}
// NewTuple6 creates a 6 elemnets tuple from a list of values.
// Play: todo
func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F] {
return Tuple6[A, B, C, D, E, F]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e, FieldF: f}
}
// Zip6 create a slice of Tuple6, whose elements are correspond to the given slice elements.
// Play: todo
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e), len(f))
tuples := make([]Tuple6[A, B, C, D, E, F], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
v4, _ := getByIndex(d, i)
v5, _ := getByIndex(e, i)
v6, _ := getByIndex(f, i)
tuples[i] = Tuple6[A, B, C, D, E, F]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5, FieldF: v6}
}
return tuples
}
// Unzip6 creates a group of slice from a slice of Tuple6.
// Play: todo
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
r6 := make([]F, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
r6[i] = t.FieldF
}
return r1, r2, r3, r4, r5, r6
}
// Tuple7 represents a 7 elemnets tuple
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
FieldF F
FieldG G
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG
}
// NewTuple7 creates a 7 elemnets tuple from a list of values.
// Play: todo
func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G] {
return Tuple7[A, B, C, D, E, F, G]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e, FieldF: f, FieldG: g}
}
// Zip7 create a slice of Tuple7, whose elements are correspond to the given slice elements.
// Play: todo
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e), len(f), len(g))
tuples := make([]Tuple7[A, B, C, D, E, F, G], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
v4, _ := getByIndex(d, i)
v5, _ := getByIndex(e, i)
v6, _ := getByIndex(f, i)
v7, _ := getByIndex(g, i)
tuples[i] = Tuple7[A, B, C, D, E, F, G]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5, FieldF: v6,
FieldG: v7}
}
return tuples
}
// Unzip7 creates a group of slice from a slice of Tuple7.
// Play: todo
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
r6 := make([]F, size)
r7 := make([]G, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
r6[i] = t.FieldF
r7[i] = t.FieldG
}
return r1, r2, r3, r4, r5, r6, r7
}
// Tuple8 represents a 8 elemnets tuple
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
FieldF F
FieldG G
FieldH H
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH
}
// NewTuple8 creates a 8 elemnets tuple from a list of values.
// Play: todo
func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H] {
return Tuple8[A, B, C, D, E, F, G, H]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e, FieldF: f, FieldG: g, FieldH: h}
}
// Zip8 create a slice of Tuple8, whose elements are correspond to the given slice elements.
// Play: todo
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e), len(f), len(g), len(h))
tuples := make([]Tuple8[A, B, C, D, E, F, G, H], size)
for i := 0; i < size; i++ {
v1, _ := getByIndex(a, i)
v2, _ := getByIndex(b, i)
v3, _ := getByIndex(c, i)
v4, _ := getByIndex(d, i)
v5, _ := getByIndex(e, i)
v6, _ := getByIndex(f, i)
v7, _ := getByIndex(g, i)
v8, _ := getByIndex(h, i)
tuples[i] = Tuple8[A, B, C, D, E, F, G, H]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5, FieldF: v6,
FieldG: v7, FieldH: v8}
}
return tuples
}
// Unzip8 creates a group of slice from a slice of Tuple8.
// Play: todo
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
r6 := make([]F, size)
r7 := make([]G, size)
r8 := make([]H, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
r6[i] = t.FieldF
r7[i] = t.FieldG
r8[i] = t.FieldH
}
return r1, r2, r3, r4, r5, r6, r7, r8
}
// Tuple9 represents a 9 elemnets tuple
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
FieldF F
FieldG G
FieldH H
FieldI I
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI
}
// NewTuple9 creates a 9 elemnets tuple from a list of values.
// Play: todo
func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I] {
return Tuple9[A, B, C, D, E, F, G, H, I]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e, FieldF: f, FieldG: g, FieldH: h, FieldI: i}
}
// Zip9 create a slice of Tuple9, whose elements are correspond to the given slice elements.
// Play: todo
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e), len(f), len(g), len(h), len(i))
tuples := make([]Tuple9[A, B, C, D, E, F, G, H, I], size)
for idx := 0; idx < size; idx++ {
v1, _ := getByIndex(a, idx)
v2, _ := getByIndex(b, idx)
v3, _ := getByIndex(c, idx)
v4, _ := getByIndex(d, idx)
v5, _ := getByIndex(e, idx)
v6, _ := getByIndex(f, idx)
v7, _ := getByIndex(g, idx)
v8, _ := getByIndex(h, idx)
v9, _ := getByIndex(i, idx)
tuples[idx] = Tuple9[A, B, C, D, E, F, G, H, I]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5, FieldF: v6,
FieldG: v7, FieldH: v8, FieldI: v9}
}
return tuples
}
// Unzip9 creates a group of slice from a slice of Tuple9.
// Play: todo
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
r6 := make([]F, size)
r7 := make([]G, size)
r8 := make([]H, size)
r9 := make([]I, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
r6[i] = t.FieldF
r7[i] = t.FieldG
r8[i] = t.FieldH
r9[i] = t.FieldI
}
return r1, r2, r3, r4, r5, r6, r7, r8, r9
}
// Tuple10 represents a 10 elemnets tuple
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
FieldA A
FieldB B
FieldC C
FieldD D
FieldE E
FieldF F
FieldG G
FieldH H
FieldI I
FieldJ J
}
// Unbox returns values in tuple.
// Play: todo
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J) {
return t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ
}
// NewTuple10 creates a 10 elemnets tuple from a list of values.
// Play: todo
func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J] {
return Tuple10[A, B, C, D, E, F, G, H, I, J]{FieldA: a, FieldB: b, FieldC: c, FieldD: d, FieldE: e, FieldF: f, FieldG: g, FieldH: h, FieldI: i, FieldJ: j}
}
// Zip10 create a slice of Tuple10, whose elements are correspond to the given slice elements.
// Play: todo
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J] {
size := mathutil.Max(len(a), len(b), len(c), len(d), len(e), len(f), len(g), len(h), len(i), len(j))
tuples := make([]Tuple10[A, B, C, D, E, F, G, H, I, J], size)
for idx := 0; idx < size; idx++ {
v1, _ := getByIndex(a, idx)
v2, _ := getByIndex(b, idx)
v3, _ := getByIndex(c, idx)
v4, _ := getByIndex(d, idx)
v5, _ := getByIndex(e, idx)
v6, _ := getByIndex(f, idx)
v7, _ := getByIndex(g, idx)
v8, _ := getByIndex(h, idx)
v9, _ := getByIndex(i, idx)
v10, _ := getByIndex(j, idx)
tuples[idx] = Tuple10[A, B, C, D, E, F, G, H, I, J]{
FieldA: v1, FieldB: v2, FieldC: v3,
FieldD: v4, FieldE: v5, FieldF: v6,
FieldG: v7, FieldH: v8, FieldI: v9,
FieldJ: v10}
}
return tuples
}
// Unzip10 creates a group of slice from a slice of Tuple10.
// Play: todo
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J) {
size := len(tuples)
r1 := make([]A, size)
r2 := make([]B, size)
r3 := make([]C, size)
r4 := make([]D, size)
r5 := make([]E, size)
r6 := make([]F, size)
r7 := make([]G, size)
r8 := make([]H, size)
r9 := make([]I, size)
r10 := make([]J, size)
for i, t := range tuples {
r1[i] = t.FieldA
r2[i] = t.FieldB
r3[i] = t.FieldC
r4[i] = t.FieldD
r5[i] = t.FieldE
r6[i] = t.FieldF
r7[i] = t.FieldG
r8[i] = t.FieldH
r9[i] = t.FieldI
r10[i] = t.FieldJ
}
return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10
}
func getByIndex[T any](slice []T, index int) (T, bool) {
l := len(slice)
if index >= l || -index > l {
var zeroVal T
return zeroVal, false
}
if index >= 0 {
return slice[index], true
}
return slice[l+index], true
}

301
tuple/tuple_example_test.go Normal file
View File

@@ -0,0 +1,301 @@
// Copyright 2023 dudaodong@gmail.com. All rights reserved.
// Use of this source code is governed by MIT license
// Package tuple implements tuple data type and some operations on it.
package tuple
import (
"fmt"
)
func ExampleNewTuple2() {
t := NewTuple2(1, 0.1)
fmt.Printf("%v %v", t.FieldA, t.FieldB)
// Output: 1 0.1
}
func ExampleTuple2_Unbox() {
t := NewTuple2(1, 0.1)
v1, v2 := t.Unbox()
fmt.Printf("%v %v", v1, v2)
// Output: 1 0.1
}
func ExampleZip2() {
result := Zip2([]int{1}, []float64{0.1})
fmt.Println(result)
// Output: [{1 0.1}]
}
func ExampleUnzip2() {
v1, v2 := Unzip2([]Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
fmt.Printf("%v %v", v1, v2)
// Output: [1] [0.1]
}
func ExampleNewTuple3() {
t := NewTuple3(1, 0.1, "a")
fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
// Output: 1 0.1 a
}
func ExampleTuple3_Unbox() {
t := NewTuple3(1, 0.1, "a")
v1, v2, v3 := t.Unbox()
fmt.Printf("%v %v %v", v1, v2, v3)
// Output: 1 0.1 a
}
func ExampleZip3() {
result := Zip3([]int{1}, []float64{0.1}, []string{"a"})
fmt.Println(result)
// Output: [{1 0.1 a}]
}
func ExampleUnzip3() {
v1, v2, v3 := Unzip3([]Tuple3[int, float64, string]{
{FieldA: 1, FieldB: 0.1, FieldC: "a"},
})
fmt.Printf("%v %v %v", v1, v2, v3)
// Output: [1] [0.1] [a]
}
func ExampleNewTuple4() {
t := NewTuple4(1, 0.1, "a", true)
fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
// Output: 1 0.1 a true
}
func ExampleTuple4_Unbox() {
t := NewTuple4(1, 0.1, "a", true)
v1, v2, v3, v4 := t.Unbox()
fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
// Output: 1 0.1 a true
}
func ExampleZip4() {
result := Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
fmt.Println(result)
// Output: [{1 0.1 a true}]
}
func ExampleUnzip4() {
v1, v2, v3, v4 := Unzip4([]Tuple4[int, float64, string, bool]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
})
fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
// Output: [1] [0.1] [a] [true]
}
func ExampleNewTuple5() {
t := NewTuple5(1, 0.1, "a", true, 2)
fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
// Output: 1 0.1 a true 2
}
func ExampleTuple5_Unbox() {
t := NewTuple5(1, 0.1, "a", true, 2)
v1, v2, v3, v4, v5 := t.Unbox()
fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
// Output: 1 0.1 a true 2
}
func ExampleZip5() {
result := Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
fmt.Println(result)
// Output: [{1 0.1 a true 2}]
}
func ExampleUnzip5() {
v1, v2, v3, v4, v5 := Unzip5([]Tuple5[int, float64, string, bool, int]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
})
fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
// Output: [1] [0.1] [a] [true] [2]
}
func ExampleNewTuple6() {
t := NewTuple6(1, 0.1, "a", true, 2, 2.2)
fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
// Output: 1 0.1 a true 2 2.2
}
func ExampleTuple6_Unbox() {
t := NewTuple6(1, 0.1, "a", true, 2, 2.2)
v1, v2, v3, v4, v5, v6 := t.Unbox()
fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
// Output: 1 0.1 a true 2 2.2
}
func ExampleZip6() {
result := Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
fmt.Println(result)
// Output: [{1 0.1 a true 2 2.2}]
}
func ExampleUnzip6() {
v1, v2, v3, v4, v5, v6 := Unzip6([]Tuple6[int, float64, string, bool, int, float32]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
})
fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
// Output: [1] [0.1] [a] [true] [2] [2.2]
}
func ExampleNewTuple7() {
t := NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
// Output: 1 0.1 a true 2 2.2 b
}
func ExampleTuple7_Unbox() {
t := NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
// Output: 1 0.1 a true 2 2.2 b
}
func ExampleZip7() {
result := Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
fmt.Println(result)
// Output: [{1 0.1 a true 2 2.2 b}]
}
func ExampleUnzip7() {
v1, v2, v3, v4, v5, v6, v7 := Unzip7([]Tuple7[int, float64, string, bool, int, float32, string]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
})
fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
// Output: [1] [0.1] [a] [true] [2] [2.2] [b]
}
func ExampleNewTuple8() {
t := NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
// Output: 1 0.1 a true 2 2.2 b c
}
func ExampleTuple8_Unbox() {
t := NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
// Output: 1 0.1 a true 2 2.2 b c
}
func ExampleZip8() {
result := Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
fmt.Println(result)
// Output: [{1 0.1 a true 2 2.2 b c}]
}
func ExampleUnzip8() {
v1, v2, v3, v4, v5, v6, v7, v8 := Unzip8([]Tuple8[int, float64, string, bool, int, float32, string, string]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
})
fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
// Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
}
func ExampleNewTuple9() {
t := NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
// Output: 1 0.1 a true 2 2.2 b c map[a:1]
}
func ExampleTuple9_Unbox() {
t := NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
// Output: 1 0.1 a true 2 2.2 b c map[a:1]
}
func ExampleZip9() {
result := Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
fmt.Println(result)
// Output: [{1 0.1 a true 2 2.2 b c 3}]
}
func ExampleUnzip9() {
v1, v2, v3, v4, v5, v6, v7, v8, v9 := Unzip9([]Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
})
fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
// Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
}
func ExampleNewTuple10() {
type foo struct {
A string
}
t := NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
// Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
}
func ExampleTuple10_Unbox() {
type foo struct {
A string
}
t := NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
// Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
}
func ExampleZip10() {
result := Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
fmt.Println(result)
// Output: [{1 0.1 a true 2 2.2 b c 3 false}]
}
func ExampleUnzip10() {
v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := Unzip10([]Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
})
fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
// Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
}

195
tuple/tuple_test.go Normal file
View File

@@ -0,0 +1,195 @@
// Copyright 2023 dudaodong@gmail.com. All rights reserved.
// Use of this source code is governed by MIT license
// Package tuple implements tuple data type and some operations on it.
package tuple
import (
"testing"
"github.com/duke-git/lancet/v2/internal"
)
func TestTuples(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTuples")
type foo struct {
A string
}
t2 := NewTuple2[int, float64](1, 0.1)
t3 := NewTuple3[int, float64, string](1, 0.1, "a")
t4 := NewTuple4[int, float64, string, bool](1, 0.1, "a", true)
t5 := NewTuple5[int, float64, string, bool, int64](1, 0.1, "a", true, 2)
t6 := NewTuple6[int, float64, string, bool, int64, float32](1, 0.1, "a", true, 2, 2.2)
t7 := NewTuple7[int, float64, string, bool, int64, float32, string](1, 0.1, "a", true, 2, 2.2, "b")
t8 := NewTuple8[int, float64, string, bool, int64, float32, string, string](1, 0.1, "a", true, 2, 2.2, "b", "c")
t9 := NewTuple9[int, float64, string, bool, int64, float32, string, string, map[string]int](1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
t10 := NewTuple10[int, float64, string, bool, int64, float32, string, string, map[string]int, foo](1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
assert.Equal(t2, Tuple2[int, float64]{FieldA: 1, FieldB: 0.1})
assert.Equal(t3, Tuple3[int, float64, string]{FieldA: 1, FieldB: 0.1, FieldC: "a"})
assert.Equal(t4, Tuple4[int, float64, string, bool]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true})
assert.Equal(t5, Tuple5[int, float64, string, bool, int64]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2})
assert.Equal(t6, Tuple6[int, float64, string, bool, int64, float32]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2})
assert.Equal(t7, Tuple7[int, float64, string, bool, int64, float32, string]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"})
assert.Equal(t8, Tuple8[int, float64, string, bool, int64, float32, string, string]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"})
assert.Equal(t9, Tuple9[int, float64, string, bool, int64, float32, string, string, map[string]int]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: map[string]int{"a": 1}})
assert.Equal(t10, Tuple10[int, float64, string, bool, int64, float32, string, string, map[string]int, foo]{FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: map[string]int{"a": 1}, FieldJ: foo{A: "a"}})
}
func TestTuple_Unbox(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTuple_Unbox")
type foo struct {
A string
}
t2 := NewTuple2[int, float64](1, 0.1)
v1, v2 := t2.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
t3 := NewTuple3[int, float64, string](1, 0.1, "a")
v1, v2, v3 := t3.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
t4 := NewTuple4[int, float64, string, bool](1, 0.1, "a", true)
v1, v2, v3, v4 := t4.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
t5 := NewTuple5[int, float64, string, bool, int64](1, 0.1, "a", true, 2)
v1, v2, v3, v4, v5 := t5.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
t6 := NewTuple6[int, float64, string, bool, int64, float32](1, 0.1, "a", true, 2, 2.2)
v1, v2, v3, v4, v5, v6 := t6.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
assert.Equal(float32(2.2), v6)
t7 := NewTuple7[int, float64, string, bool, int64, float32, string](1, 0.1, "a", true, 2, 2.2, "b")
v1, v2, v3, v4, v5, v6, v7 := t7.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
assert.Equal(float32(2.2), v6)
assert.Equal("b", v7)
t8 := NewTuple8[int, float64, string, bool, int64, float32, string, string](1, 0.1, "a", true, 2, 2.2, "b", "c")
v1, v2, v3, v4, v5, v6, v7, v8 := t8.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
assert.Equal(float32(2.2), v6)
assert.Equal("b", v7)
assert.Equal("c", v8)
t9 := NewTuple9[int, float64, string, bool, int64, float32, string, string, map[string]int](1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
v1, v2, v3, v4, v5, v6, v7, v8, v9 := t9.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
assert.Equal(float32(2.2), v6)
assert.Equal("b", v7)
assert.Equal("c", v8)
assert.Equal(map[string]int{"a": 1}, v9)
t10 := NewTuple10[int, float64, string, bool, int64, float32, string, string, map[string]int, foo](1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t10.Unbox()
assert.Equal(1, v1)
assert.Equal(0.1, v2)
assert.Equal("a", v3)
assert.Equal(true, v4)
assert.Equal(int64(2), v5)
assert.Equal(float32(2.2), v6)
assert.Equal("b", v7)
assert.Equal("c", v8)
assert.Equal(map[string]int{"a": 1}, v9)
assert.Equal(foo{A: "a"}, v10)
}
func TestZip(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestZip")
r2 := Zip2(
[]int{1, 2},
[]string{"a", "b"},
)
assert.Equal(r2, []Tuple2[int, string]{
{FieldA: 1, FieldB: "a"},
{FieldA: 2, FieldB: "b"},
})
r3 := Zip3(
[]int{1, 2, 3},
[]string{"a", "b", "c"},
[]float64{0.1, 0.2, 0.3},
)
assert.Equal(r3, []Tuple3[int, string, float64]{
{FieldA: 1, FieldB: "a", FieldC: 0.1},
{FieldA: 2, FieldB: "b", FieldC: 0.2},
{FieldA: 3, FieldB: "c", FieldC: 0.3},
})
r4 := Zip4(
[]int{1, 2, 3, 4},
[]string{"a", "b", "c", "d"},
[]float64{0.1, 0.2, 0.3, 0.4},
[]bool{true, true, true, true},
)
assert.Equal(r4, []Tuple4[int, string, float64, bool]{
{FieldA: 1, FieldB: "a", FieldC: 0.1, FieldD: true},
{FieldA: 2, FieldB: "b", FieldC: 0.2, FieldD: true},
{FieldA: 3, FieldB: "c", FieldC: 0.3, FieldD: true},
{FieldA: 4, FieldB: "d", FieldC: 0.4, FieldD: true},
})
r5 := Zip5(
[]int{1, 2, 3, 4, 5},
[]string{"a", "b", "c", "d", "e"},
[]float64{0.1, 0.2, 0.3, 0.4, 0.5},
[]bool{true, true, true, true, true},
[]int{6, 7, 8, 9, 10},
)
assert.Equal(r5, []Tuple5[int, string, float64, bool, int]{
{FieldA: 1, FieldB: "a", FieldC: 0.1, FieldD: true, FieldE: 6},
{FieldA: 2, FieldB: "b", FieldC: 0.2, FieldD: true, FieldE: 7},
{FieldA: 3, FieldB: "c", FieldC: 0.3, FieldD: true, FieldE: 8},
{FieldA: 4, FieldB: "d", FieldC: 0.4, FieldD: true, FieldE: 9},
{FieldA: 5, FieldB: "e", FieldC: 0.5, FieldD: true, FieldE: 10},
})
}
func TestUnzip(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestUnzip")
r1, r2, r3 := Unzip3([]Tuple3[string, int, float64]{{FieldA: "a", FieldB: 1, FieldC: 0.1}, {FieldA: "b", FieldB: 2, FieldC: 0.2}})
assert.Equal(r1, []string{"a", "b"})
assert.Equal(r2, []int{1, 2})
assert.Equal(r3, []float64{0.1, 0.2})
}

View File

@@ -11,6 +11,8 @@ import (
)
func TestIsAllUpper(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsAllUpper")
assert.Equal(true, IsAllUpper("ABC"))
@@ -26,6 +28,8 @@ func TestIsAllUpper(t *testing.T) {
}
func TestIsAllLower(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsAllLower")
assert.Equal(true, IsAllLower("abc"))
@@ -41,6 +45,8 @@ func TestIsAllLower(t *testing.T) {
}
func TestContainLower(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainLower")
assert.Equal(true, ContainLower("abc"))
@@ -57,6 +63,8 @@ func TestContainLower(t *testing.T) {
}
func TestContainUpper(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainUpper")
assert.Equal(true, ContainUpper("ABC"))
@@ -73,6 +81,8 @@ func TestContainUpper(t *testing.T) {
}
func TestContainLetter(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainLetter")
assert.Equal(true, ContainLetter("ABC"))
@@ -87,6 +97,8 @@ func TestContainLetter(t *testing.T) {
}
func TestContainNumber(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainNumber")
assert.Equal(true, ContainNumber("123"))
@@ -104,6 +116,8 @@ func TestContainNumber(t *testing.T) {
}
func TestIsJSON(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsJSON")
assert.Equal(true, IsJSON("{}"))
@@ -118,6 +132,8 @@ func TestIsJSON(t *testing.T) {
}
func TestIsNumber(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsNumber")
assert.Equal(false, IsNumber(""))
@@ -127,6 +143,8 @@ func TestIsNumber(t *testing.T) {
}
func TestIsFloat(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsFloat")
assert.Equal(false, IsFloat(""))
@@ -136,6 +154,8 @@ func TestIsFloat(t *testing.T) {
}
func TestIsInt(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsInt")
assert.Equal(false, IsInt(""))
@@ -146,6 +166,8 @@ func TestIsInt(t *testing.T) {
}
func TestIsNumberStr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsNumberStr")
assert.Equal(true, IsNumberStr("3."))
@@ -156,6 +178,8 @@ func TestIsNumberStr(t *testing.T) {
}
func TestIsFloatStr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsFloatStr")
assert.Equal(true, IsFloatStr("3."))
@@ -166,6 +190,8 @@ func TestIsFloatStr(t *testing.T) {
}
func TestIsIntStr(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsIntStr")
assert.Equal(true, IsIntStr("+3"))
@@ -175,6 +201,8 @@ func TestIsIntStr(t *testing.T) {
}
func TestIsPort(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsPort")
assert.Equal(true, IsPort("1"))
@@ -187,6 +215,8 @@ func TestIsPort(t *testing.T) {
}
func TestIsIp(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsIntStr")
assert.Equal(true, IsIp("127.0.0.1"))
@@ -196,6 +226,8 @@ func TestIsIp(t *testing.T) {
}
func TestIsIpV4(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsIpV4")
assert.Equal(true, IsIpV4("127.0.0.1"))
@@ -203,6 +235,8 @@ func TestIsIpV4(t *testing.T) {
}
func TestIsIpV6(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsIpV6")
assert.Equal(false, IsIpV6("127.0.0.1"))
@@ -210,6 +244,8 @@ func TestIsIpV6(t *testing.T) {
}
func TestIsUrl(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsUrl")
assert.Equal(true, IsUrl("http://abc.com"))
@@ -219,6 +255,8 @@ func TestIsUrl(t *testing.T) {
}
func TestIsDns(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsDns")
assert.Equal(true, IsDns("abc.com"))
@@ -227,6 +265,8 @@ func TestIsDns(t *testing.T) {
}
func TestIsEmail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsEmail")
assert.Equal(true, IsEmail("abc@xyz.com"))
@@ -234,6 +274,8 @@ func TestIsEmail(t *testing.T) {
}
func TestContainChinese(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestContainChinese")
assert.Equal(true, ContainChinese("你好"))
@@ -242,6 +284,8 @@ func TestContainChinese(t *testing.T) {
}
func TestIsChineseMobile(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsChineseMobile")
assert.Equal(true, IsChineseMobile("13263527980"))
@@ -249,6 +293,8 @@ func TestIsChineseMobile(t *testing.T) {
}
func TestIsChinesePhone(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsChinesePhone")
assert.Equal(true, IsChinesePhone("010-32116675"))
@@ -259,6 +305,8 @@ func TestIsChinesePhone(t *testing.T) {
}
func TestIsChineseIdNum(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsChineseIdNum")
assert.Equal(true, IsChineseIdNum("210911192105130715"))
@@ -268,6 +316,8 @@ func TestIsChineseIdNum(t *testing.T) {
}
func TestIsCreditCard(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsCreditCard")
assert.Equal(true, IsCreditCard("4111111111111111"))
@@ -275,6 +325,8 @@ func TestIsCreditCard(t *testing.T) {
}
func TestIsBase64(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsBase64")
assert.Equal(true, IsBase64("aGVsbG8="))
@@ -282,6 +334,8 @@ func TestIsBase64(t *testing.T) {
}
func TestIsEmptyString(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsEmptyString")
assert.Equal(true, IsEmptyString(""))
@@ -291,6 +345,8 @@ func TestIsEmptyString(t *testing.T) {
}
func TestIsAlpha(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsAlpha")
assert.Equal(true, IsAlpha("abc"))
@@ -301,6 +357,8 @@ func TestIsAlpha(t *testing.T) {
}
func TestIsRegexMatch(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsRegexMatch")
assert.Equal(true, IsRegexMatch("abc", `^[a-zA-Z]+$`))
@@ -309,6 +367,8 @@ func TestIsRegexMatch(t *testing.T) {
}
func TestIsStrongPassword(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsStrongPassword")
assert.Equal(false, IsStrongPassword("abc", 3))
@@ -321,6 +381,8 @@ func TestIsStrongPassword(t *testing.T) {
}
func TestIsWeakPassword(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsWeakPassword")
assert.Equal(true, IsWeakPassword("abc"))
@@ -331,6 +393,8 @@ func TestIsWeakPassword(t *testing.T) {
}
func TestIsZeroValue(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsZeroValue")
var (
@@ -438,6 +502,8 @@ func TestIsZeroValue(t *testing.T) {
}
func TestIsGBK(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsGBK")
str := "你好"
@@ -448,6 +514,8 @@ func TestIsGBK(t *testing.T) {
}
func TestIsASCII(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsASCII")
assert.Equal(true, IsASCII("ABC"))
@@ -458,6 +526,8 @@ func TestIsASCII(t *testing.T) {
}
func TestIsPrintable(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestIsPrintable")
assert.Equal(true, IsPrintable("ABC"))

View File

@@ -10,11 +10,15 @@ import (
)
func TestTryUnwrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTryUnwrap")
assert.Equal(42, TryUnwrap(strconv.Atoi("42")))
}
func TestTryUnwrapFail(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestTryUnwrapFail")
_, err := strconv.Atoi("4o2")
@@ -27,6 +31,8 @@ func TestTryUnwrapFail(t *testing.T) {
}
func TestNew(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestNew")
err := New("error occurs")
@@ -34,6 +40,8 @@ func TestNew(t *testing.T) {
}
func TestWrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestWrap")
err := New("wrong password")
@@ -43,6 +51,8 @@ func TestWrap(t *testing.T) {
}
func TestXError_Wrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestXError_Wrap")
err1 := New("error").With("level", "high")
@@ -52,6 +62,8 @@ func TestXError_Wrap(t *testing.T) {
}
func TestXError_Unwrap(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestXError_Unwrap")
err1 := New("error").With("level", "high")
@@ -64,6 +76,8 @@ func TestXError_Unwrap(t *testing.T) {
}
func TestXError_StackTrace(t *testing.T) {
// t.Parallel()
assert := internal.NewAssert(t, "TestXError_StackTrace")
err := New("error")
@@ -72,11 +86,13 @@ func TestXError_StackTrace(t *testing.T) {
assert.Equal(3, len(stacks))
assert.Equal("github.com/duke-git/lancet/v2/xerror.TestXError_StackTrace", stacks[0].Func)
assert.Equal(69, stacks[0].Line)
assert.Equal(83, stacks[0].Line)
assert.Equal(true, strings.Contains(stacks[0].File, "xerror_test.go"))
}
func TestXError_With_Id_Is_Values(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestXError_With_Id_Is_Values")
baseErr := New("baseError")
@@ -94,6 +110,8 @@ func TestXError_With_Id_Is_Values(t *testing.T) {
}
func TestXError_Info(t *testing.T) {
t.Parallel()
assert := internal.NewAssert(t, "TestXError_Info")
cause := errors.New("error")