1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
"""
Test that we can print and call closures passed in various contexts
"""
from __future__ import print_function
import os
import time
import re
import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
class TestPassedClosures(TestBase):
NO_DEBUG_INFO_TESTCASE = True
@expectedFailureAll(bugnumber="rdar://31816998")
def test_static_closure_type(self):
"""This tests that we can print a closure with statically known return type."""
self.build()
self.static_type(False)
@expectedFailureAll(bugnumber="rdar://31816998")
def test_static_closure_call(self):
"""This tests that we can call a closure with statically known return type."""
self.build()
self.static_type(True)
@expectedFailureAll(bugnumber="rdar://31816998")
def test_generic_closure_type(self):
"""This tests that we can print a closure with generic return type."""
self.build()
self.generic_type(False)
@expectedFailureAll(bugnumber="rdar://31816998")
def test_generic_closure_call(self):
"""This tests that we can call a closure with generic return type."""
self.build()
self.generic_type(True)
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
def get_to_bkpt (self, bkpt_name):
self.build()
lldbutil.run_to_source_breakpoint(self, bkpt_name,
lldb.SBFileSpec('main.swift'))
def static_type(self, test_call):
self.get_to_bkpt("break here for static type")
opts = lldb.SBExpressionOptions()
if not test_call:
# First see that we can print the function we were passed:
result = self.frame().EvaluateExpression("fn", opts)
error = result.GetError()
self.assertSuccess(error, "'fn' failed")
self.assertTrue("() -> Swift.Int" in result.GetValue(), "Got the function name wrong: %s."%(result.GetValue()))
self.assertTrue("() -> Swift.Int" in result.GetTypeName(), "Got the function type wrong: %s."%(result.GetTypeName()))
if test_call:
# Now see that we can call it:
result = self.frame().EvaluateExpression("fn()", opts)
error.result.GetError()
self.assertSuccess(error, "'fn()' failed")
self.assertTrue(result.GetValue() == "3", "Got the wrong value: %s"%(result.GetValue()))
def generic_type(self, test_call):
self.get_to_bkpt("break here for generic type")
opts = lldb.SBExpressionOptions()
if not test_call:
# First see that we can print the function we were passed:
result = self.frame().EvaluateExpression("fn", opts)
error = result.GetError()
self.assertSuccess(error, "'fn' failed")
self.assertTrue("() -> A" in result.GetValue(), "Got the function name wrong: %s."%(result.GetValue()))
self.assertTrue("() -> A" in result.GetTypeName(), "Got the function type wrong: %s."%(result.GetTypeName()))
if test_call:
# Now see that we can call it:
result = self.frame().EvaluateExpression("fn()", opts)
error.result.GetError()
self.assertSuccess(error, "'fn()' failed")
self.assertTrue(result.GetValue() == "3", "Got the wrong value: %s"%(result.GetValue()))
|