content: /*
   *  Copyright 2016-2024 Qameta Software Inc
   *
   *  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 io.qameta.allure.category;
  
  import io.qameta.allure.entity.TestResult;
  import io.qameta.allure.metric.Metric;
  import io.qameta.allure.metric.MetricLine;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.concurrent.atomic.AtomicLong;
  import java.util.function.BiFunction;
  import java.util.stream.Collectors;
  
  /**
   * @author charlie (Dmitry Baev).
   */
  public class CategoriesMetric implements Metric {
  
      private final Map<String, AtomicLong> values = new HashMap<>();
  
      private final BiFunction<String, Long, MetricLine> lineFactory;
  
      public CategoriesMetric(final BiFunction<String, Long, MetricLine> lineFactory) {
          this.lineFactory = lineFactory;
      }
  
      @Override
      public void update(final TestResult testResult) {
          if (testResult.isRetry()) {
              return;
          }
          testResult.<List<Category>>getExtraBlock("categories", new ArrayList<>()).stream()
                  .map(Category::getName)
                  .forEach(categoryName -> values.computeIfAbsent(categoryName, s -> new AtomicLong()).incrementAndGet());
      }
  
      @Override
      public List<MetricLine> getLines() {
          return values.entrySet().stream()
                  .map(entry -> lineFactory.apply(entry.getKey(), entry.getValue().longValue()))
                  .collect(Collectors.toList());
      }
  }
  