// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

import 'package:mdtest_tools/src/mobile/device_spec.dart';
import 'package:mdtest_tools/src/mobile/device.dart';
import 'package:mdtest_tools/src/mobile/key_provider.dart';
import 'package:mdtest_tools/src/algorithms/coverage.dart';
import 'package:mdtest_tools/src/algorithms/matching.dart';

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

import 'src/mocks.dart';

void main() {
  group('coverage matrix', () {
    test('0 reachable paths', () {
      MockCoverageMatrix baseMatrix = new MockCoverageMatrix();
      when(baseMatrix.matrix).thenReturn(
        [
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered]
        ]
      );
      MockCoverageMatrix newMatrix = new MockCoverageMatrix();
      when(newMatrix.matrix).thenReturn(
        [
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered]
        ]
      );
      int reward = computeReward(baseMatrix, newMatrix);
      expect(reward, equals(0));
    });

    test('3 reachable paths', () {
      MockCoverageMatrix baseMatrix = new MockCoverageMatrix();
      when(baseMatrix.matrix).thenReturn(
        [
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered]
        ]
      );
      MockCoverageMatrix newMatrix = new MockCoverageMatrix();
      when(newMatrix.matrix).thenReturn(
        [
          [cannotBeCovered, cannotBeCovered, isNotCovered],
          [cannotBeCovered, isNotCovered, cannotBeCovered],
          [cannotBeCovered, isNotCovered, cannotBeCovered]
        ]
      );
      int reward = computeReward(baseMatrix, newMatrix);
      expect(reward, equals(3));
    });

    test('all reachable paths', () {
      MockCoverageMatrix baseMatrix = new MockCoverageMatrix();
      when(baseMatrix.matrix).thenReturn(
        [
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered],
          [cannotBeCovered, cannotBeCovered, cannotBeCovered]
        ]
      );
      MockCoverageMatrix newMatrix = new MockCoverageMatrix();
      when(newMatrix.matrix).thenReturn(
        [
          [isNotCovered, isNotCovered, isNotCovered],
          [isNotCovered, isNotCovered, isNotCovered],
          [isNotCovered, isNotCovered, isNotCovered]
        ]
      );
      int reward = computeReward(baseMatrix, newMatrix);
      expect(reward, equals(9));
    });
  });

  group('coverage algorithm', () {
    test('with device id as device key', () {
      List<DeviceSpec> specs = <DeviceSpec>[
        new DeviceSpec(
          'Alice',
          specProperties: {
            'app-root': 'xxx',
            'app-path': 'yyy'
          }
        ),
        new DeviceSpec(
          'Bob',
          specProperties: {
            'app-root': 'xxx',
            'app-path': 'zzz'
          }
        )
      ];
      List<Device> devices = <Device>[
        new Device(
          properties: <String, String>{
            'platform': 'android',
            'device-id': '123',
            'model-name': 'Nexus 9',
            'os-version': '6.0.1',
            'screen-size': 'xlarge'
          },
          groupKey: 'device-id'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 6S',
            'os-version': '9.3.2',
            'screen-size': 'large'
          },
          groupKey: 'device-id'
        )
      ];
      Map<DeviceSpec, Set<Device>> individualMatches
        = findIndividualMatches(specs, devices);
      List<Map<DeviceSpec, Device>> allDeviceMappings
        = findAllMatchingDeviceMappings(specs, individualMatches);
      Map<String, List<Device>> deviceGroups = buildGroups(devices);
      Map<String, List<DeviceSpec>> specGroups = buildGroups(specs);
      GroupInfo groupInfo = new GroupInfo(deviceGroups, specGroups);
      Map<CoverageMatrix, Map<DeviceSpec, Device>> cov2match
        = buildCoverage2MatchMapping(allDeviceMappings, groupInfo);
      CoverageMatrix appDeviceCoverageMatrix = new CoverageMatrix(groupInfo);
      findMinimumMappings(cov2match, appDeviceCoverageMatrix);
      List<List<int>> matrix = appDeviceCoverageMatrix.matrix;
      for (List<int> row in matrix) {
        for (int e in row) {
          expect(e, equals(0));
        }
      }
    });

    test('with platform as device key', () {
      List<DeviceSpec> specs = <DeviceSpec>[
        new DeviceSpec(
          'Alice',
          specProperties: {
            'platform': 'android',
            'app-root': 'xxx',
            'app-path': 'yyy'
          }
        ),
        new DeviceSpec(
          'Bob',
          specProperties: {
            'app-root': 'xxx',
            'app-path': 'zzz'
          }
        )
      ];
      List<Device> devices = <Device>[
        new Device(
          properties: <String, String>{
            'platform': 'android',
            'device-id': '123',
            'model-name': 'Nexus 9',
            'os-version': '6.0.1',
            'screen-size': 'xlarge'
          },
          groupKey: 'platform'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 6S',
            'os-version': '9.3.2',
            'screen-size': 'large'
          },
          groupKey: 'platform'
        )
      ];
      Map<DeviceSpec, Set<Device>> individualMatches
        = findIndividualMatches(specs, devices);
      List<Map<DeviceSpec, Device>> allDeviceMappings
        = findAllMatchingDeviceMappings(specs, individualMatches);
      Map<String, List<Device>> deviceGroups = buildGroups(devices);
      Map<String, List<DeviceSpec>> specGroups = buildGroups(specs);
      GroupInfo groupInfo = new GroupInfo(deviceGroups, specGroups);
      Map<CoverageMatrix, Map<DeviceSpec, Device>> cov2match
        = buildCoverage2MatchMapping(allDeviceMappings, groupInfo);
      CoverageMatrix appDeviceCoverageMatrix = new CoverageMatrix(groupInfo);
      findMinimumMappings(cov2match, appDeviceCoverageMatrix);
      List<List<int>> matrix = appDeviceCoverageMatrix.matrix;
      expect(matrix[0][0], equals(0));
      expect(matrix[0][1], equals(-1));
      expect(matrix[1][0], equals(-1));
      expect(matrix[1][1], equals(0));
    });

    test('with model name as device key', () {
      List<DeviceSpec> specs = <DeviceSpec>[
        new DeviceSpec(
          'Alice',
          specProperties: {
            'app-root': 'xxx',
            'app-path': 'yyy'
          }
        ),
        new DeviceSpec(
          'Bob',
          specProperties: {
            'model-name': 'Nexus 9',
            'app-root': 'xxx',
            'app-path': 'zzz'
          }
        )
      ];
      List<Device> devices = <Device>[
        new Device(
          properties: <String, String>{
            'platform': 'android',
            'device-id': '123',
            'model-name': 'Nexus 9',
            'os-version': '6.0.1',
            'screen-size': 'xlarge'
          },
          groupKey: 'model-name'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 6S',
            'os-version': '9.3.2',
            'screen-size': 'large'
          },
          groupKey: 'model-name'
        )
      ];
      Map<DeviceSpec, Set<Device>> individualMatches
        = findIndividualMatches(specs, devices);
      List<Map<DeviceSpec, Device>> allDeviceMappings
        = findAllMatchingDeviceMappings(specs, individualMatches);
      Map<String, List<Device>> deviceGroups = buildGroups(devices);
      Map<String, List<DeviceSpec>> specGroups = buildGroups(specs);
      GroupInfo groupInfo = new GroupInfo(deviceGroups, specGroups);
      Map<CoverageMatrix, Map<DeviceSpec, Device>> cov2match
        = buildCoverage2MatchMapping(allDeviceMappings, groupInfo);
      CoverageMatrix appDeviceCoverageMatrix = new CoverageMatrix(groupInfo);
      findMinimumMappings(cov2match, appDeviceCoverageMatrix);
      List<List<int>> matrix = appDeviceCoverageMatrix.matrix;
      expect(matrix[0][0], equals(-1));
      expect(matrix[0][1], equals(0));
      expect(matrix[1][0], equals(0));
      expect(matrix[1][1], equals(-1));
    });

    test('with OS version as device key', () {
      List<DeviceSpec> specs = <DeviceSpec>[
        new DeviceSpec(
          'Alice',
          specProperties: {
            'app-root': 'xxx',
            'app-path': 'yyy'
          }
        ),
        new DeviceSpec(
          'Bob',
          specProperties: {
            'platform': 'ios',
            'os-version': '^9.0.0',
            'app-root': 'xxx',
            'app-path': 'zzz'
          }
        )
      ];
      List<Device> devices = <Device>[
        new Device(
          properties: <String, String>{
            'platform': 'android',
            'device-id': '123',
            'model-name': 'Nexus 9',
            'os-version': '6.0.1',
            'screen-size': 'xlarge'
          },
          groupKey: 'os-version'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 6S',
            'os-version': '9.3.2',
            'screen-size': 'large'
          },
          groupKey: 'os-version'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 5',
            'os-version': '8.4.2',
            'screen-size': 'normal'
          },
          groupKey: 'os-version'
        )
      ];
      Map<DeviceSpec, Set<Device>> individualMatches
        = findIndividualMatches(specs, devices);
      List<Map<DeviceSpec, Device>> allDeviceMappings
        = findAllMatchingDeviceMappings(specs, individualMatches);
      Map<String, List<Device>> deviceGroups = buildGroups(devices);
      Map<String, List<DeviceSpec>> specGroups = buildGroups(specs);
      GroupInfo groupInfo = new GroupInfo(deviceGroups, specGroups);
      Map<CoverageMatrix, Map<DeviceSpec, Device>> cov2match
        = buildCoverage2MatchMapping(allDeviceMappings, groupInfo);
      CoverageMatrix appDeviceCoverageMatrix = new CoverageMatrix(groupInfo);
      findMinimumMappings(cov2match, appDeviceCoverageMatrix);
      List<List<int>> matrix = appDeviceCoverageMatrix.matrix;
      expect(matrix[0][0], equals(0));
      expect(matrix[0][1], equals(-1));
      expect(matrix[0][2], equals(0));
      expect(matrix[1][0], equals(-1));
      expect(matrix[1][1], equals(0));
      expect(matrix[1][2], equals(-1));
    });

    test('with screen size as device key', () {
      List<DeviceSpec> specs = <DeviceSpec>[
        new DeviceSpec(
          'Alice',
          specProperties: {
            'screen-size': 'normal',
            'app-root': 'xxx',
            'app-path': 'yyy'
          }
        ),
        new DeviceSpec(
          'Bob',
          specProperties: {
            'screen-size': 'large',
            'app-root': 'xxx',
            'app-path': 'zzz'
          }
        )
      ];
      List<Device> devices = <Device>[
        new Device(
          properties: <String, String>{
            'platform': 'android',
            'device-id': '123',
            'model-name': 'Nexus 9',
            'os-version': '6.0.1',
            'screen-size': 'xlarge'
          },
          groupKey: 'os-version'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 6S',
            'os-version': '9.3.2',
            'screen-size': 'large'
          },
          groupKey: 'os-version'
        ),
        new Device(
          properties: <String, String>{
            'platform': 'ios',
            'device-id': '456',
            'model-name': 'iPhone 5',
            'os-version': '8.4.2',
            'screen-size': 'normal'
          },
          groupKey: 'os-version'
        )
      ];
      Map<DeviceSpec, Set<Device>> individualMatches
        = findIndividualMatches(specs, devices);
      List<Map<DeviceSpec, Device>> allDeviceMappings
        = findAllMatchingDeviceMappings(specs, individualMatches);
      Map<String, List<Device>> deviceGroups = buildGroups(devices);
      Map<String, List<DeviceSpec>> specGroups = buildGroups(specs);
      GroupInfo groupInfo = new GroupInfo(deviceGroups, specGroups);
      Map<CoverageMatrix, Map<DeviceSpec, Device>> cov2match
        = buildCoverage2MatchMapping(allDeviceMappings, groupInfo);
      CoverageMatrix appDeviceCoverageMatrix = new CoverageMatrix(groupInfo);
      findMinimumMappings(cov2match, appDeviceCoverageMatrix);
      List<List<int>> matrix = appDeviceCoverageMatrix.matrix;
      expect(matrix[0][0], equals(-1));
      expect(matrix[0][1], equals(-1));
      expect(matrix[0][2], equals(0));
      expect(matrix[1][0], equals(-1));
      expect(matrix[1][1], equals(0));
      expect(matrix[1][2], equals(-1));
    });
  });
}
