# 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
#
#     https://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.

from typing import Any, Dict, Optional, Sequence, Type, Union

import sympy

import cirq

_setup_code = ('import cirq\n'
               'import numpy as np\n'
               'import sympy\n'
               'import openfermion\n')


def assert_equivalent_repr(value: Any, *,
                           setup_code: str = _setup_code) -> None:
    """Checks that eval(repr(v)) == v.

    Args:
        value: A value whose repr should be evaluatable python
            code that produces an equivalent value.
        setup_code: Code that must be executed before the repr can be evaluated.
            Ideally this should just be a series of 'import' lines.
    """
    cirq.testing.assert_equivalent_repr(value, setup_code=setup_code)


def assert_implements_consistent_protocols(
        val: Any,
        *,
        exponents: Sequence[Any] = (0, 1, -1, 0.5, 0.25, -0.5, 0.1,
                                    sympy.Symbol('s')),
        qubit_count: Optional[int] = None,
        ignoring_global_phase: bool = False,
        setup_code: str = _setup_code,
        global_vals: Optional[Dict[str, Any]] = None,
        local_vals: Optional[Dict[str, Any]] = None) -> None:
    """Checks that a value is internally consistent and has a good __repr__."""

    cirq.testing.assert_implements_consistent_protocols(
        val,
        exponents=exponents,
        qubit_count=qubit_count,
        ignoring_global_phase=ignoring_global_phase,
        setup_code=setup_code,
        global_vals=global_vals,
        local_vals=local_vals)

@@ -644,17 +644,17 @@
 code = (
-'
+%22
 import c
@@ -658,17 +658,17 @@
 t cirq%5Cn
-'
+%22
 %0A       
@@ -671,25 +671,25 @@
             
-'
+%22
 import numpy
@@ -696,17 +696,17 @@
  as np%5Cn
-'
+%22
 %0A       
@@ -709,25 +709,25 @@
             
-'
+%22
 import sympy
@@ -728,17 +728,17 @@
  sympy%5Cn
-'
+%22
 %0A       
@@ -745,17 +745,17 @@
         
-'
+%22
 import o
@@ -766,17 +766,17 @@
 ermion%5Cn
-'
+%22
 )%0A%0A%0Adef 
@@ -1468,11 +1468,11 @@
 bol(
-'s'
+%22s%22
 )),%0A
@@ -1794,17 +1794,49 @@
 r__.%22%22%22%0A
-%0A
+    try:%0A        # Cirq 0.14%0A    
     cirq
@@ -1896,13 +1896,21 @@
     
+    
 val,%0A
+    
     
@@ -1934,32 +1934,36 @@
 onents,%0A        
+   
+ 
 qubit_count=qubi
@@ -1971,16 +1971,20 @@
 _count,%0A
+    
         
@@ -2024,24 +2024,82 @@
 obal_phase,%0A
+            ignore_decompose_to_default_gateset=True,%0A    
         setu
@@ -2117,32 +2117,36 @@
 p_code,%0A        
+  
+  
 global_vals=glob
@@ -2154,32 +2154,36 @@
 l_vals,%0A        
+    
 local_vals=local
@@ -2187,10 +2187,584 @@
 cal_vals
-)
+,%0A        )%0A    except TypeError:  # coverage: ignore%0A        # Cirq 0.12%0A        cirq.testing.assert_implements_consistent_protocols(  # coverage: ignore%0A            val,  # coverage: ignore%0A            exponents=exponents,  # coverage: ignore%0A            qubit_count=qubit_count,  # coverage: ignore%0A            ignoring_global_phase=ignoring_global_phase,  # coverage: ignore%0A            setup_code=setup_code,  # coverage: ignore%0A            global_vals=global_vals,  # coverage: ignore%0A            local_vals=local_vals,  # coverage: ignore%0A        )  # coverage: ignore
 %0A

Fix cirq coverage test (#779)