(rng *rand.Rand, cfg randConfig)
| 109 | const escapeAlphabet = `"\/'bfnrtu` |
| 110 | |
| 111 | func randomJSONString(rng *rand.Rand, cfg randConfig) string { |
| 112 | if cfg.maxLen <= defaultRandStrLen && rng.Intn(2) == 0 { |
| 113 | return staticStrings[rng.Intn(len(staticStrings))] |
| 114 | } |
| 115 | |
| 116 | // generate string of this size, biased to produce larger strings. |
| 117 | l := rng.Intn(cfg.maxLen-cfg.maxLen/4) + cfg.maxLen>>2 |
| 118 | if cfg.escapeProb == 0 { |
| 119 | return randutil.RandString(rng, l, randutil.PrintableKeyAlphabet) |
| 120 | } |
| 121 | |
| 122 | result := make([]byte, 0) |
| 123 | |
| 124 | for i := 0; i < l; i++ { |
| 125 | if rng.Float32() < cfg.escapeProb { |
| 126 | c := escapeAlphabet[rng.Intn(len(escapeAlphabet))] |
| 127 | result = append(result, '\\', c) |
| 128 | i++ |
| 129 | if c == 'u' { |
| 130 | // Generate random unicode sequence. |
| 131 | result = append(result, []byte(randutil.RandString(rng, 4, hexAlphabetUpperAndLower))...) |
| 132 | i += 4 |
| 133 | } |
| 134 | } else { |
| 135 | c := byte(rng.Intn(0x7f-0x20) + 0x20) |
| 136 | if c == '\\' { |
| 137 | // Retry -- escape handled above. |
| 138 | i-- |
| 139 | continue |
| 140 | } |
| 141 | result = append(result, c) |
| 142 | } |
| 143 | } |
| 144 | return string(result) |
| 145 | } |
| 146 | |
| 147 | func randomJSONNumber(rng *rand.Rand) interface{} { |
| 148 | return json.Number(fmt.Sprintf("%v", rng.ExpFloat64())) |
no test coverage detected
searching dependent graphs…