/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.codahale.shamir.benchmarks;

import com.codahale.shamir.Part;
import com.codahale.shamir.Scheme;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import okio.ByteString;
import org.openjdk.jmh.Main;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.runner.RunnerException;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class Benchmarks {

  private static final ByteString SECRET = ByteString.of(new byte[1024]);
  private static final Scheme SCHEME = Scheme.of(5, 3);
  private static final Set<Part> PARTS = SCHEME.split(SECRET);

  public static void main(String[] args) throws IOException, RunnerException {
    Main.main(args);
  }

  @Benchmark
  public Set<Part> split() {
    return SCHEME.split(SECRET);
  }

  @Benchmark
  public ByteString join() {
    return SCHEME.join(PARTS);
  }
}

@@ -746,32 +746,68 @@
 rrent.TimeUnit;%0A
+import java.util.stream.Collectors;%0A
 import okio.Byte
@@ -1027,24 +1027,192 @@
 utTimeUnit;%0A
+import org.openjdk.jmh.annotations.Param;%0Aimport org.openjdk.jmh.annotations.Scope;%0Aimport org.openjdk.jmh.annotations.Setup;%0Aimport org.openjdk.jmh.annotations.State;%0A
 import org.o
@@ -1319,16 +1319,40 @@
 ECONDS)%0A
+@State(Scope.Benchmark)%0A
 public c
@@ -1376,297 +1376,547 @@
 %0A%0A  
-private static final ByteString SECRET = ByteString.of(new byte%5B1024%5D);%0A  private static final Scheme SCHEME = Scheme.of(5, 3);%0A  private static final Set%3CPart%3E PARTS = SCHEME.split(SECRET);%0A%0A  public static void main(String%5B%5D args) throws IOException, RunnerException %7B%0A    Main.main(args
+@Param(%7B%22100%22, %221024%22%7D)%0A  private int secretSize = 1024;%0A  @Param(%7B%222%22, %224%22, %228%22, %2216%22, %2232%22%7D)%0A  private int n = 2;%0A  private ByteString secret;%0A  private Scheme scheme;%0A  private Set%3CPart%3E parts;%0A%0A  public static void main(String%5B%5D args) throws IOException, RunnerException %7B%0A    Main.main(args);%0A  %7D%0A%0A  @Setup%0A  public void setup() %7B%0A    this.secret = ByteString.of(new byte%5BsecretSize%5D);%0A    final int k = (n / 2) + 1;%0A    this.scheme = Scheme.of(n, k);%0A    this.parts = scheme.split(secret).stream().limit(k).collect(Collectors.toSet()
 );%0A 
@@ -1976,27 +1976,27 @@
 urn 
-SCHEME
+scheme
 .split(
-SECRET
+secret
 );%0A 
@@ -2056,25 +2056,25 @@
 urn 
-SCHEME
+scheme
 .join(
-PARTS
+parts
 );%0A 

Refactor benchmarks.