| # Copyright 2017 The Bazel Authors. All rights reserved. |
| # |
| # 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. |
| |
| from __future__ import print_function |
| |
| import os.path |
| import re |
| import subprocess |
| import tempfile |
| import unittest |
| |
| from src.test.skylark import testenv |
| |
| |
| class SkylarkTest(unittest.TestCase): |
| """Tests for Skylark. |
| |
| In a test file, chunks are separated by "---". Each chunk is evaluated |
| separately. Use "###" to specify the expected error. If there is no "###", |
| the test will succeed iff there is no error. |
| """ |
| |
| CHUNK_SEP = "---" |
| ERR_SEP = "###" |
| |
| def chunks(self, path): |
| code = [] |
| expected_errors = [] |
| with open(path) as f: |
| for line in f: |
| if line.strip() == self.CHUNK_SEP: |
| yield code, expected_errors |
| expected_errors = [] |
| code = [] |
| else: |
| code.append(line) |
| i = line.find(self.ERR_SEP) |
| if i >= 0: |
| expected_errors.append(line[i + len(self.ERR_SEP):].strip()) |
| yield code, expected_errors |
| |
| def evaluate(self, f): |
| """Execute Skylark file, return stderr.""" |
| proc = subprocess.Popen( |
| [testenv.SKYLARK_BINARY_PATH, f], stderr=subprocess.PIPE) |
| _, stderr = proc.communicate() |
| return stderr |
| |
| def check_output(self, output, expected): |
| if expected and not output: |
| raise Exception("Expected error:", expected) |
| |
| if output and not expected: |
| raise Exception("Unexpected error:", output) |
| |
| for exp in expected: |
| if not re.search(exp, output): |
| raise Exception("Error `{}` not found, got: {}".format(exp, output)) |
| |
| def testSuccess(self): |
| tests = ["int.sky", "equality.sky", "and_or_not.sky"] |
| for t in tests: |
| print("===", t, "===") |
| f = os.path.join(testenv.SKYLARK_TESTDATA_PATH, t) |
| for chunk, expected in self.chunks(f): |
| with tempfile.NamedTemporaryFile(suffix=".sky", delete=False) as tmp: |
| tmp.writelines(chunk) |
| output = self.evaluate(tmp.name) |
| os.unlink(tmp.name) |
| self.check_output(output, expected) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |