Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/pkgchk-cli/Console.fs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ module Console =
let formatSeverities severities =
severities
|> Seq.map formatSeverity
|> String.join ", "
|> List.ofSeq
|> String.joinPretty "," "or"
|> sprintf "Vulnerabilities found matching %s"
|> italic
|> Seq.singleton
Expand Down
3 changes: 2 additions & 1 deletion src/pkgchk-cli/Markdown.fs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ module Markdown =
let formatSeverities severities =
severities
|> Seq.map formatSeverityColour
|> String.join ", "
|> List.ofSeq
|> String.joinPretty "," "or"
|> sprintf "__Vulnerabilities found matching %s__"

let footer =
Expand Down
22 changes: 21 additions & 1 deletion src/pkgchk-cli/Utils.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,31 @@ open System.Diagnostics

module String =
[<DebuggerStepThrough>]
let join (separator) (lines: seq<string>) = String.Join(separator, lines)
let join separator (lines: seq<string>) = String.Join(separator, lines)

[<DebuggerStepThrough>]
let joinLines (lines: seq<string>) = join Environment.NewLine lines

[<DebuggerStepThrough>]
let joinPretty separator finalSeparator (values: string list) =
let separator = $" {separator} "
let finalSeparator = $" {finalSeparator} "

let rec concat (values: string list) (accum: System.Text.StringBuilder) =
let suffix (sep: string) (accum: System.Text.StringBuilder) =
if accum.Length > 0 then accum.Append(sep) else accum

match values with
| [] -> accum.ToString()
| [ x ] ->
let accum = accum |> suffix finalSeparator
accum.Append(x).ToString()
| h :: t ->
let accum = accum |> suffix separator
accum.Append(h) |> concat t

concat values (new System.Text.StringBuilder())

[<DebuggerStepThrough>]
let isEmpty = String.IsNullOrWhiteSpace

Expand Down
71 changes: 71 additions & 0 deletions tests/pkgchk-cli.tests/StringsTests.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
namespace pkgchk.tests

open System
open FsCheck
open FsCheck.Xunit


module StringsTests =

[<Property>]
let ``join conjugates strings`` (count: PositiveInt) =
let values = [ 0 .. count.Get ] |> Seq.map (fun _ -> "A") |> Array.ofSeq

let result = values |> pkgchk.String.join " "

let expected = result.Split(' ', StringSplitOptions.None)

expected = values

[<Property(Verbose = true)>]
let ``joinPretty has correct value count`` (count: PositiveInt) =
let values = [ 1 .. count.Get ] |> Seq.map (fun _ -> "A") |> List.ofSeq
let finalSeparator = "or"
let separator = ","

let result = values |> pkgchk.String.joinPretty separator finalSeparator

let counts =
result.Split(' ', StringSplitOptions.None)
|> Array.map (fun s -> s.Replace(separator, ""))
|> Array.countBy id
|> Map.ofSeq

counts.["A"] = count.Get


[<Property(Verbose = true)>]
let ``joinPretty has correct intermediary separators`` (count: PositiveInt) =
let values = [ 1 .. count.Get ] |> Seq.map (fun _ -> "A") |> List.ofSeq
let finalSeparator = "or"
let separator = ','

let result = values |> pkgchk.String.joinPretty separator finalSeparator

let decomp = result.ToCharArray() |> Array.filter (fun c -> c = separator)

match (count.Get, decomp) with
| (x, [||]) when x <= 2 -> true
| _ ->
let counts = decomp |> Array.countBy id |> Map.ofSeq
counts.[separator] = count.Get - 2


[<Property(Verbose = true)>]
let ``joinPretty has correct last separator`` (count: PositiveInt) =
let values = [ 1 .. count.Get ] |> Seq.map (fun _ -> "A") |> List.ofSeq
let finalSeparator = "or"
let separator = ","

let result = values |> pkgchk.String.joinPretty separator finalSeparator

let decomp = result.Split(' ', StringSplitOptions.None) |> Array.rev

let counts = decomp |> Array.countBy id |> Map.ofSeq

match count.Get with
| 1 -> counts.["A"] = count.Get && decomp |> Array.contains finalSeparator |> not
| x ->
let pos = Array.IndexOf(decomp, finalSeparator)

counts.[finalSeparator] = 1 && counts.["A"] = count.Get && pos = 1
1 change: 1 addition & 0 deletions tests/pkgchk-cli.tests/pkgchk-cli.tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
<ItemGroup>
<EmbeddedResource Include="ScaSampleWithVulnerabilities.json" />
<EmbeddedResource Include="ScaSampleEmpty.json" />
<Compile Include="StringsTests.fs" />
<Compile Include="ScaArgsTests.fs" />
<Compile Include="ScaTests.fs" />
<Compile Include="ConsoleTests.fs" />
Expand Down