#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.


# Usage: check_source_count.py SEARCH_TERM COUNT ERROR_LOCATION REPLACEMENT [FILES...]
#   Checks that FILES contains exactly COUNT matches of SEARCH_TERM. If it does
#   not, an error message is printed, quoting ERROR_LOCATION, which should
#   probably be the filename and line number of the erroneous call to
#   check_source_count.py.
from __future__ import print_function
import sys
import os
import re

search_string = sys.argv[1]
expected_count = int(sys.argv[2])
error_location = sys.argv[3]
replacement = sys.argv[4]
files = sys.argv[5:]

details = {}

count = 0
for f in files:
    text = file(f).read()
    match = re.findall(search_string, text)
    if match:
        num = len(match)
        count += num
        details[f] = num

if count == expected_count:
    print("TEST-PASS | check_source_count.py {0} | {1}"
          .format(search_string, expected_count))

else:
    print("TEST-UNEXPECTED-FAIL | check_source_count.py {0} | "
          .format(search_string),
          end='')
    if count < expected_count:
        print("There are fewer occurrences of /{0}/ than expected. "
              "This may mean that you have removed some, but forgotten to "
              "account for it {1}.".format(search_string, error_location))
    else:
        print("There are more occurrences of /{0}/ than expected. We're trying "
              "to prevent an increase in the number of {1}'s, using {2} if "
              "possible. If it is unavoidable, you should update the expected "
              "count {3}.".format(search_string, search_string, replacement, 
                                 error_location))

    print("Expected: {0}; found: {1}".format(expected_count, count))
    for k in sorted(details):
        print("Found {0} occurences in {1}".format(details[k],k))
    sys.exit(-1)

