diff options
Diffstat (limited to 'blockly/tests/generators/unittest_python.js')
-rw-r--r-- | blockly/tests/generators/unittest_python.js | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/blockly/tests/generators/unittest_python.js b/blockly/tests/generators/unittest_python.js new file mode 100644 index 0000000..2b459aa --- /dev/null +++ b/blockly/tests/generators/unittest_python.js @@ -0,0 +1,152 @@ +/** + * @license + * Visual Blocks Language + * + * Copyright 2012 Google Inc. + * https://developers.google.com/blockly/ + * + * 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. + */ + +/** + * @fileoverview Generating Python for unit test blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +Blockly.Python['unittest_main'] = function(block) { + // Container for unit tests. + var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', + Blockly.Variables.NAME_TYPE); + var functionName = Blockly.Python.provideFunction_( + 'unittest_report', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '():', + ' # Create test report.', + ' report = []', + ' summary = []', + ' fails = 0', + ' for (success, log, message) in ' + resultsVar + ':', + ' if success:', + ' summary.append(".")', + ' else:', + ' summary.append("F")', + ' fails += 1', + ' report.append("")', + ' report.append("FAIL: " + message)', + ' report.append(log)', + ' report.insert(0, "".join(summary))', + ' report.append("")', + ' report.append("Number of tests run: %d" % len(' + resultsVar + '))', + ' report.append("")', + ' if fails:', + ' report.append("FAILED (failures=%d)" % fails)', + ' else:', + ' report.append("OK")', + ' return "\\n".join(report)']); + + // Setup global to hold test results. + var code = resultsVar + ' = []\n'; + // Run tests (unindented). + code += Blockly.Python.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + var reportVar = Blockly.Python.variableDB_.getDistinctName( + 'report', Blockly.Variables.NAME_TYPE); + code += reportVar + ' = ' + functionName + '()\n'; + // Destroy results. + code += resultsVar + ' = None\n'; + // Print the report. + code += 'print(' + reportVar + ')\n'; + return code; +}; + +Blockly.Python['unittest_main'].defineAssert_ = function() { + var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', + Blockly.Variables.NAME_TYPE); + var functionName = Blockly.Python.provideFunction_( + 'assertEquals', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(actual, expected, message):', + ' # Asserts that a value equals another value.', + ' if ' + resultsVar + ' == None:', + ' raise Exception("Orphaned assert equals: " + message)', + ' if actual == expected:', + ' ' + resultsVar + '.append((True, "OK", message))', + ' else:', + ' ' + resultsVar + '.append((False, ' + + '"Expected: %s\\nActual: %s" % (expected, actual), message))']); + return functionName; +}; + +Blockly.Python['unittest_assertequals'] = function(block) { + // Asserts that a value equals another value. + var message = Blockly.Python.valueToCode(block, 'MESSAGE', + Blockly.Python.ORDER_NONE) || ''; + var actual = Blockly.Python.valueToCode(block, 'ACTUAL', + Blockly.Python.ORDER_NONE) || 'None'; + var expected = Blockly.Python.valueToCode(block, 'EXPECTED', + Blockly.Python.ORDER_NONE) || 'None'; + return Blockly.Python['unittest_main'].defineAssert_() + + '(' + actual + ', ' + expected + ', ' + message + ')\n'; +}; + +Blockly.Python['unittest_assertvalue'] = function(block) { + // Asserts that a value is true, false, or null. + var message = Blockly.Python.valueToCode(block, 'MESSAGE', + Blockly.Python.ORDER_NONE) || ''; + var actual = Blockly.Python.valueToCode(block, 'ACTUAL', + Blockly.Python.ORDER_NONE) || 'None'; + var expected = block.getFieldValue('EXPECTED'); + if (expected == 'TRUE') { + expected = 'True'; + } else if (expected == 'FALSE') { + expected = 'False'; + } else if (expected == 'NULL') { + expected = 'None'; + } + return Blockly.Python['unittest_main'].defineAssert_() + + '(' + actual + ', ' + expected + ', ' + message + ')\n'; +}; + +Blockly.Python['unittest_fail'] = function(block) { + // Always assert an error. + var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', + Blockly.Variables.NAME_TYPE); + var message = Blockly.Python.valueToCode(block, 'MESSAGE', + Blockly.Python.ORDER_NONE) || ''; + var functionName = Blockly.Python.provideFunction_( + 'fail', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(message):', + ' # Always assert an error.', + ' if ' + resultsVar + ' == None:', + ' raise Exception("Orphaned assert equals: " + message)', + ' ' + resultsVar + '.append((False, "Fail.", message))']); + return functionName + '(' + message + ')\n'; +}; + +Blockly.Python['unittest_adjustindex'] = function(block) { + var index = Blockly.Python.valueToCode(block, 'INDEX', + Blockly.Python.ORDER_ADDITIVE) || '0'; + // Adjust index if using one-based indexing. + if (Blockly.Python.ONE_BASED_INDEXING) { + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [parseFloat(index) + 1, Blockly.Python.ORDER_ATOMIC]; + } else { + // If the index is dynamic, adjust it in code. + index = index + ' + 1'; + } + } else if (Blockly.isNumber(index)) { + return [index, Blockly.Python.ORDER_ATOMIC]; + } + return [index, Blockly.Python.ORDER_ADDITIVE]; +}; |