diff --git a/detox/src/ios/earlgreyapi/GREYMatchers+Detox.js b/detox/src/ios/earlgreyapi/GREYMatchers+Detox.js deleted file mode 100644 index 9bb25fc868..0000000000 --- a/detox/src/ios/earlgreyapi/GREYMatchers+Detox.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - - This code is generated. - For more information see generation/README.md. -*/ - - -// Globally declared helpers - -function sanitize_greyDirection(action) { - switch (action) { - case "left": - return 1; - case "right": - return 2; - case "up": - return 3; - case "down": - return 4; - - default: - throw new Error(`GREYAction.GREYDirection must be a 'left'/'right'/'up'/'down', got ${action}`); - } -} - -function sanitize_greyContentEdge(action) { - switch (action) { - case "left": - return 0; - case "right": - return 1; - case "top": - return 2; - case "bottom": - return 3; - - default: - throw new Error(`GREYAction.GREYContentEdge must be a 'left'/'right'/'top'/'bottom', got ${action}`); - } -} - - - -class GREYMatchers { - static detoxMatcherForText(text) { - if (typeof text !== "string") throw new Error("text should be a string, but got " + (text + (" (" + (typeof text + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForText:", - args: [{ - type: "NSString", - value: text - }] - }; - } - - static detoxMatcherForScrollChildOfMatcher(matcher) { - if (typeof matcher !== "object" || matcher.type !== "Invocation" || typeof matcher.value !== "object" || typeof matcher.value.target !== "object" || matcher.value.target.value !== "GREYMatchers") { - throw new Error('matcher should be a GREYMatcher, but got ' + JSON.stringify(matcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForScrollChildOfMatcher:", - args: [matcher] - }; - } - - static detoxMatcherAvoidingProblematicReactNativeElements(matcher) { - if (typeof matcher !== "object" || matcher.type !== "Invocation" || typeof matcher.value !== "object" || typeof matcher.value.target !== "object" || matcher.value.target.value !== "GREYMatchers") { - throw new Error('matcher should be a GREYMatcher, but got ' + JSON.stringify(matcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherAvoidingProblematicReactNativeElements:", - args: [matcher] - }; - } - - static detoxMatcherForBothAnd(firstMatcher, secondMatcher) { - if (typeof firstMatcher !== "object" || firstMatcher.type !== "Invocation" || typeof firstMatcher.value !== "object" || typeof firstMatcher.value.target !== "object" || firstMatcher.value.target.value !== "GREYMatchers") { - throw new Error('firstMatcher should be a GREYMatcher, but got ' + JSON.stringify(firstMatcher)); - } - - if (typeof secondMatcher !== "object" || secondMatcher.type !== "Invocation" || typeof secondMatcher.value !== "object" || typeof secondMatcher.value.target !== "object" || secondMatcher.value.target.value !== "GREYMatchers") { - throw new Error('secondMatcher should be a GREYMatcher, but got ' + JSON.stringify(secondMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForBoth:and:", - args: [firstMatcher, secondMatcher] - }; - } - - static detoxMatcherForBothAndAncestorMatcher(firstMatcher, ancestorMatcher) { - if (typeof firstMatcher !== "object" || firstMatcher.type !== "Invocation" || typeof firstMatcher.value !== "object" || typeof firstMatcher.value.target !== "object" || firstMatcher.value.target.value !== "GREYMatchers") { - throw new Error('firstMatcher should be a GREYMatcher, but got ' + JSON.stringify(firstMatcher)); - } - - if (typeof ancestorMatcher !== "object" || ancestorMatcher.type !== "Invocation" || typeof ancestorMatcher.value !== "object" || typeof ancestorMatcher.value.target !== "object" || ancestorMatcher.value.target.value !== "GREYMatchers") { - throw new Error('ancestorMatcher should be a GREYMatcher, but got ' + JSON.stringify(ancestorMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForBoth:andAncestorMatcher:", - args: [firstMatcher, ancestorMatcher] - }; - } - - static detoxMatcherForBothAndDescendantMatcher(firstMatcher, descendantMatcher) { - if (typeof firstMatcher !== "object" || firstMatcher.type !== "Invocation" || typeof firstMatcher.value !== "object" || typeof firstMatcher.value.target !== "object" || firstMatcher.value.target.value !== "GREYMatchers") { - throw new Error('firstMatcher should be a GREYMatcher, but got ' + JSON.stringify(firstMatcher)); - } - - if (typeof descendantMatcher !== "object" || descendantMatcher.type !== "Invocation" || typeof descendantMatcher.value !== "object" || typeof descendantMatcher.value.target !== "object" || descendantMatcher.value.target.value !== "GREYMatchers") { - throw new Error('descendantMatcher should be a GREYMatcher, but got ' + JSON.stringify(descendantMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForBoth:andDescendantMatcher:", - args: [firstMatcher, descendantMatcher] - }; - } - - static detoxMatcherForNot(matcher) { - if (typeof matcher !== "object" || matcher.type !== "Invocation" || typeof matcher.value !== "object" || typeof matcher.value.target !== "object" || matcher.value.target.value !== "GREYMatchers") { - throw new Error('matcher should be a GREYMatcher, but got ' + JSON.stringify(matcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForNot:", - args: [matcher] - }; - } - - static detoxMatcherForClass(aClassName) { - if (typeof aClassName !== "string") throw new Error("aClassName should be a string, but got " + (aClassName + (" (" + (typeof aClassName + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "detoxMatcherForClass:", - args: [{ - type: "NSString", - value: aClassName - }] - }; - } - -} - -module.exports = GREYMatchers; \ No newline at end of file diff --git a/detox/src/ios/earlgreyapi/GREYMatchers.js b/detox/src/ios/earlgreyapi/GREYMatchers.js deleted file mode 100644 index 17dbebb7ef..0000000000 --- a/detox/src/ios/earlgreyapi/GREYMatchers.js +++ /dev/null @@ -1,577 +0,0 @@ -/** - - This code is generated. - For more information see generation/README.md. -*/ - - -// Globally declared helpers - -function sanitize_greyDirection(action) { - switch (action) { - case "left": - return 1; - case "right": - return 2; - case "up": - return 3; - case "down": - return 4; - - default: - throw new Error(`GREYAction.GREYDirection must be a 'left'/'right'/'up'/'down', got ${action}`); - } -} - -function sanitize_greyContentEdge(action) { - switch (action) { - case "left": - return 0; - case "right": - return 1; - case "top": - return 2; - case "bottom": - return 3; - - default: - throw new Error(`GREYAction.GREYContentEdge must be a 'left'/'right'/'top'/'bottom', got ${action}`); - } -} - - - -class GREYMatchers { - /*Matcher for application's key window. - -@return A matcher for the application's key window. -*/static matcherForKeyWindow() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForKeyWindow", - args: [] - }; - } - - /*Matcher for UI element with the provided accessibility @c label. - -@param label The accessibility label to be matched. - -@return A matcher for the accessibility label of an accessible element. -*/static matcherForAccessibilityLabel(label) { - if (typeof label !== "string") throw new Error("label should be a string, but got " + (label + (" (" + (typeof label + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityLabel:", - args: [{ - type: "NSString", - value: label - }] - }; - } - - /*Matcher for UI element with the provided accessibility ID @c accessibilityID. - -@param accessibilityID The accessibility ID to be matched. - -@return A matcher for the accessibility ID of an accessible element. -*/static matcherForAccessibilityID(accessibilityID) { - if (typeof accessibilityID !== "string") throw new Error("accessibilityID should be a string, but got " + (accessibilityID + (" (" + (typeof accessibilityID + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityID:", - args: [{ - type: "NSString", - value: accessibilityID - }] - }; - } - - /*Matcher for UI element with the provided accessibility @c value. - -@param value The accessibility value to be matched. - -@return A matcher for the accessibility value of an accessible element. -*/static matcherForAccessibilityValue(value) { - if (typeof value !== "string") throw new Error("value should be a string, but got " + (value + (" (" + (typeof value + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityValue:", - args: [{ - type: "NSString", - value: value - }] - }; - } - - /*Matcher for UI element with the provided accessiblity @c hint. - -@param hint The accessibility hint to be matched. - -@return A matcher for the accessibility hint of an accessible element. -*/static matcherForAccessibilityHint(hint) { - if (typeof hint !== "string") throw new Error("hint should be a string, but got " + (hint + (" (" + (typeof hint + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityHint:", - args: [{ - type: "NSString", - value: hint - }] - }; - } - - /*Matcher for UI element with accessiblity focus. - -@return A matcher for the accessibility focus of an accessible element. -*/static matcherForAccessibilityElementIsFocused() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityElementIsFocused", - args: [] - }; - } - - /*Matcher for UI elements of type UIButton, UILabel, UITextField or UITextView displaying the -provided @c inputText. - -@param text The text to be matched in the UI elements. - -@return A matcher to check for any UI elements with a text field containing the given text. -*/static matcherForText(text) { - if (typeof text !== "string") throw new Error("text should be a string, but got " + (text + (" (" + (typeof text + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForText:", - args: [{ - type: "NSString", - value: text - }] - }; - } - - /*Matcher for element that is the first responder. - -@return A matcher that verifies if a UI element is the first responder. -*/static matcherForFirstResponder() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForFirstResponder", - args: [] - }; - } - - /*Matcher to check if system alert view is shown. - -@return A matcher to check if a system alert view is being shown. -*/static matcherForSystemAlertViewShown() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForSystemAlertViewShown", - args: [] - }; - } - - /*Matcher for UI element whose percent visible area (of its accessibility frame) exceeds the -given @c percent. - -@param percent The percent visible area that the UI element being matched has to be visible. -Allowed values for @c percent are [0,1] inclusive. - -@return A matcher that checks if a UI element has a visible area at least equal -to a minimum value. -*/static matcherForMinimumVisiblePercent(percent) { - if (typeof percent !== "number") throw new Error("percent should be a number, but got " + (percent + (" (" + (typeof percent + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForMinimumVisiblePercent:", - args: [{ - type: "CGFloat", - value: percent - }] - }; - } - - /*Matcher for UI element that is sufficiently visible to the user. EarlGrey considers elements -with visible area percentage greater than @c kElementSufficientlyVisiblePercentage (0.75) -to be sufficiently visible. - -@return A matcher intialized with a visibility percentage that confirms an element is -sufficiently visible. -*/static matcherForSufficientlyVisible() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForSufficientlyVisible", - args: [] - }; - } - - /*Matcher for UI element that are not visible to the user i.e. has a zero visible area. - -@return A matcher for verifying if an element is not visible. -*/static matcherForNotVisible() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForNotVisible", - args: [] - }; - } - - /*Matcher for UI element that matches EarlGrey's criteria for user interaction currently it must -satisfy at least the following criteria: - - -@return A matcher that checks if a UI element is interactable. -*/static matcherForInteractable() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForInteractable", - args: [] - }; - } - - /*Matcher to check if a UI element is accessible. - -@return A matcher that checks if a UI element is accessible. -*/static matcherForAccessibilityElement() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAccessibilityElement", - args: [] - }; - } - - /*Matcher for matching UIProgressView's values. Use greaterThan, greaterThanOrEqualTo, -lessThan etc to create @c comparisonMatcher. For example, to match the UIProgressView -elements that have progress value greater than 50.2, use -@code [GREYMatchers matcherForProgress:grey_greaterThan(@(50.2))] @endcode. In case if an -unimplemented matcher is required, please implement it similar to @c grey_closeTo. - -@param comparisonMatcher The matcher with the value to check the progress against. - -@return A matcher for checking a UIProgessView's value. -*/static matcherForProgress(comparisonMatcher) { - if (typeof comparisonMatcher !== "object" || comparisonMatcher.type !== "Invocation" || typeof comparisonMatcher.value !== "object" || typeof comparisonMatcher.value.target !== "object" || comparisonMatcher.value.target.value !== "GREYMatchers") { - throw new Error('comparisonMatcher should be a GREYMatcher, but got ' + JSON.stringify(comparisonMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForProgress:", - args: [comparisonMatcher] - }; - } - - /*Matcher that matches UI element based on the presence of an ancestor in its hierarchy. -The given matcher is used to match decendants. - -@param ancestorMatcher The ancestor UI element whose descendants are to be matched. - -@return A matcher to check if a UI element is the descendant of another. -*/static matcherForAncestor(ancestorMatcher) { - if (typeof ancestorMatcher !== "object" || ancestorMatcher.type !== "Invocation" || typeof ancestorMatcher.value !== "object" || typeof ancestorMatcher.value.target !== "object" || ancestorMatcher.value.target.value !== "GREYMatchers") { - throw new Error('ancestorMatcher should be a GREYMatcher, but got ' + JSON.stringify(ancestorMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAncestor:", - args: [ancestorMatcher] - }; - } - - /*Matcher that matches any UI element with a descendant matching the given matcher. - -@param descendantMatcher A matcher being checked to be a descendant -of the UI element being checked. - -@return A matcher to check if a the specified element is in a descendant of another UI element. -*/static matcherForDescendant(descendantMatcher) { - if (typeof descendantMatcher !== "object" || descendantMatcher.type !== "Invocation" || typeof descendantMatcher.value !== "object" || typeof descendantMatcher.value.target !== "object" || descendantMatcher.value.target.value !== "GREYMatchers") { - throw new Error('descendantMatcher should be a GREYMatcher, but got ' + JSON.stringify(descendantMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForDescendant:", - args: [descendantMatcher] - }; - } - - /*Matcher that matches UIButton that has title label as @c text. - -@param title The title to be checked on the UIButtons being matched. - -@return A matcher to confirm UIButton titles. -*/static matcherForButtonTitle(title) { - if (typeof title !== "string") throw new Error("title should be a string, but got " + (title + (" (" + (typeof title + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForButtonTitle:", - args: [{ - type: "NSString", - value: title - }] - }; - } - - /*Matcher that matches UIScrollView that has contentOffset as @c offset. - -@param offset The content offset to be checked on the UIScrollView being -matched. - -@return A matcher to confirm UIScrollView content offset. -*/static matcherForScrollViewContentOffset(offset) { - if (typeof offset !== "object") throw new Error("offset should be a object, but got " + (offset + (" (" + (typeof offset + ")")))); - if (typeof offset.x !== "number") throw new Error("offset.x should be a number, but got " + (offset.x + (" (" + (typeof offset.x + ")")))); - if (typeof offset.y !== "number") throw new Error("offset.y should be a number, but got " + (offset.y + (" (" + (typeof offset.y + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForScrollViewContentOffset:", - args: [{ - type: "CGPoint", - value: offset - }] - }; - } - - /*Matcher that matches a UISlider's value. - -@param valueMatcher A matcher for the UISlider's value. You must provide a valid -@c valueMatcher for the floating point value comparison. The -@c valueMatcher should be of the type @c closeTo, @c greaterThan, -@c lessThan, @c lessThanOrEqualTo, @c greaterThanOrEqualTo. The -value matchers should account for any loss in precision for the given -floating point value. If you are using @c grey_closeTo, use delta diff as -@c kGREYAcceptableFloatDifference. In case if an unimplemented matcher -is required, please implement it similar to @c grey_closeTo. - -@return A matcher for checking a UISlider's value. -*/static matcherForSliderValueMatcher(valueMatcher) { - if (typeof valueMatcher !== "object" || valueMatcher.type !== "Invocation" || typeof valueMatcher.value !== "object" || typeof valueMatcher.value.target !== "object" || valueMatcher.value.target.value !== "GREYMatchers") { - throw new Error('valueMatcher should be a GREYMatcher, but got ' + JSON.stringify(valueMatcher)); - } - - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForSliderValueMatcher:", - args: [valueMatcher] - }; - } - - /*Matcher that matches UIPickerView that has a column set to @c value. - -@param column The column of the UIPickerView to be matched. -@param value The value that should be set in the column of the UIPickerView. - -@return A matcher to check the value in a particular column of a UIPickerView. -*/static matcherForPickerColumnSetToValue(column, value) { - if (typeof column !== "number") throw new Error("column should be a number, but got " + (column + (" (" + (typeof column + ")")))); - if (typeof value !== "string") throw new Error("value should be a string, but got " + (value + (" (" + (typeof value + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForPickerColumn:setToValue:", - args: [{ - type: "NSInteger", - value: column - }, { - type: "NSString", - value: value - }] - }; - } - - /*Matcher that verifies whether an element, that is a UIControl, is enabled. - -@return A matcher for checking whether a UI element is an enabled UIControl. -*/static matcherForEnabledElement() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForEnabledElement", - args: [] - }; - } - - /*Matcher that verifies whether an element, that is a UIControl, is selected. - -@return A matcher for checking whether a UI element is a selected UIControl. -*/static matcherForSelectedElement() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForSelectedElement", - args: [] - }; - } - - /*Matcher that verifies whether a view has its userInteractionEnabled property set to @c YES. - -@return A matcher for checking whether a view' userInteractionEnabled property is set to @c YES. -*/static matcherForUserInteractionEnabled() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForUserInteractionEnabled", - args: [] - }; - } - - /*Matcher primarily for asserting that the element is @c nil or not found. - -@return A matcher to check if a specified element is @c nil or not found. -*/static matcherForNil() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForNil", - args: [] - }; - } - - /*Matcher for asserting that the element exists in the UI hierarchy (i.e. not @c nil). - -@return A matcher to check if a specified element is not @c nil. -*/static matcherForNotNil() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForNotNil", - args: [] - }; - } - - /*A Matcher that matches against any object, including @c nils. - -@return A matcher that matches any object. -*/static matcherForAnything() { - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForAnything", - args: [] - }; - } - - /*Matcher that matches a UIScrollView scrolled to content @c edge. - -@param edge The content edge UIScrollView should be scrolled to. - -@return A matcher that matches a UIScrollView scrolled to content @c edge. -*/static matcherForScrolledToContentEdge(edge) { - if (!["left", "right", "top", "bottom"].some(option => option === edge)) throw new Error("edge should be one of [left, right, top, bottom], but got " + edge); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForScrolledToContentEdge:", - args: [{ - type: "NSInteger", - value: sanitize_greyContentEdge(edge) - }] - }; - } - - /*Matcher that matches a UITextField's content. - -@param value The text string contained inside the UITextField. - -@return A matcher that matches the value inside a UITextField. -*/static matcherForTextFieldValue(value) { - if (typeof value !== "string") throw new Error("value should be a string, but got " + (value + (" (" + (typeof value + ")")))); - return { - target: { - type: "Class", - value: "GREYMatchers" - }, - method: "matcherForTextFieldValue:", - args: [{ - type: "NSString", - value: value - }] - }; - } - -} - -module.exports = GREYMatchers; \ No newline at end of file diff --git a/detox/src/ios/matchers.js b/detox/src/ios/matchers.js index 16753d52ef..badfc113f6 100644 --- a/detox/src/ios/matchers.js +++ b/detox/src/ios/matchers.js @@ -1,36 +1,37 @@ const invoke = require('../invoke'); -const GreyMatchers = require('./earlgreyapi/GREYMatchers'); -const GreyMatchersDetox = require('./earlgreyapi/GREYMatchers+Detox'); class Matcher { withAncestor(matcher) { + if (!(matcher instanceof Matcher)) throw new Error(`Matcher withAncestor argument must be a valid Matcher, got ${typeof matcher}`); const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForBothAndAncestorMatcher(_originalMatcherCall, matcher._call)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForBoth:andAncestorMatcher:', _originalMatcherCall, matcher._call); return this; } withDescendant(matcher) { + if (!(matcher instanceof Matcher)) throw new Error(`Matcher withDescendant argument must be a valid Matcher, got ${typeof matcher}`); const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForBothAndDescendantMatcher(_originalMatcherCall, matcher._call)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForBoth:andDescendantMatcher:', _originalMatcherCall, matcher._call); return this; } and(matcher) { + if (!(matcher instanceof Matcher)) throw new Error(`Matcher and argument must be a valid Matcher, got ${typeof matcher}`); const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForBothAnd(_originalMatcherCall, matcher._call)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForBoth:and:', _originalMatcherCall, matcher._call); return this; } not() { const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForNot(_originalMatcherCall)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForNot:', _originalMatcherCall); return this; } _avoidProblematicReactNativeElements() { const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherAvoidingProblematicReactNativeElements(_originalMatcherCall)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherAvoidingProblematicReactNativeElements:', _originalMatcherCall); return this; } _extendToDescendantScrollViews() { const _originalMatcherCall = this._call; - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForScrollChildOfMatcher(_originalMatcherCall)); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForScrollChildOfMatcher:', _originalMatcherCall); return this; } } @@ -46,14 +47,16 @@ class LabelMatcher extends Matcher { class IdMatcher extends Matcher { constructor(value) { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForAccessibilityID(value)); + if (typeof value !== 'string') throw new Error(`IdMatcher ctor argument must be a string, got ${typeof value}`); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForAccessibilityID:', value); } } class TypeMatcher extends Matcher { constructor(value) { super(); - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForClass(value)); + if (typeof value !== 'string') throw new Error(`TypeMatcher ctor argument must be a string, got ${typeof value}`); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForClass:', value); } } @@ -90,42 +93,44 @@ class TraitsMatcher extends Matcher { class VisibleMatcher extends Matcher { constructor() { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForSufficientlyVisible()); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForSufficientlyVisible'); } } class NotVisibleMatcher extends Matcher { constructor() { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForNotVisible()); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForNotVisible'); } } class ExistsMatcher extends Matcher { constructor() { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForNotNil()); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForNotNil'); } } class NotExistsMatcher extends Matcher { constructor() { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForNil()); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForNil'); } } class TextMatcher extends Matcher { constructor(value) { super(); - this._call = invoke.callDirectly(GreyMatchersDetox.detoxMatcherForText(value)); + if (typeof value !== 'string') throw new Error(`TextMatcher ctor argument must be a string, got ${typeof value}`); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'detoxMatcherForText:', value); } } class ValueMatcher extends Matcher { constructor(value) { super(); - this._call = invoke.callDirectly(GreyMatchers.matcherForAccessibilityValue(value)); + if (typeof value !== 'string') throw new Error(`ValueMatcher ctor argument must be a string, got ${typeof value}`); + this._call = invoke.call(invoke.IOS.Class('GREYMatchers'), 'matcherForAccessibilityValue:', value); } } diff --git a/generation/__tests__/__snapshots__/earl-grey.js.snap b/generation/__tests__/__snapshots__/earl-grey.js.snap index b5f323fff1..a44881bf56 100644 --- a/generation/__tests__/__snapshots__/earl-grey.js.snap +++ b/generation/__tests__/__snapshots__/earl-grey.js.snap @@ -92,9 +92,3 @@ Object { }, } `; - -exports[`earl-grey generation special case: id should fail with wrongly formatted matchers 1`] = `"firstMatcher should be a GREYMatcher, but got {\\"type\\":\\"Invocation\\",\\"value\\":{\\"target\\":{\\"type\\":\\"Class\\",\\"value\\":\\"GREYAction\\"},\\"method\\":\\"matcherForAccessibilityID:\\",\\"args\\":[\\"Grandfather883\\"]}}"`; - -exports[`earl-grey generation special case: id should fail with wrongly formatted matchers 2`] = `"ancestorMatcher should be a GREYMatcher, but got {\\"type\\":\\"Invocation\\",\\"value\\":{\\"target\\":{\\"type\\":\\"Class\\",\\"value\\":\\"GREYAction\\"},\\"method\\":\\"matcherForAccessibilityID:\\",\\"args\\":[\\"Grandson883\\"]}}"`; - -exports[`earl-grey generation special case: id should fail with wrongly formatted matchers 3`] = `"firstMatcher should be a GREYMatcher, but got {\\"type\\":\\"Invocation\\",\\"value\\":{\\"method\\":\\"matcherForAccessibilityID:\\",\\"args\\":[\\"Grandfather883\\"]}}"`; diff --git a/generation/__tests__/__snapshots__/helpers.js.snap b/generation/__tests__/__snapshots__/helpers.js.snap deleted file mode 100644 index 41542647ab..0000000000 --- a/generation/__tests__/__snapshots__/helpers.js.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`helpers methodNameToSnakeCase should return the correct snake case method name 1`] = `"actionForScrollInDirectionAmountXOriginStartPercentageYOriginStartPercentage"`; diff --git a/generation/__tests__/earl-grey.js b/generation/__tests__/earl-grey.js index 50f11fdbfe..7428516cd0 100644 --- a/generation/__tests__/earl-grey.js +++ b/generation/__tests__/earl-grey.js @@ -166,162 +166,6 @@ describe("earl-grey generation", () => { }); }); - describe("special case: id", () => { - it("should not wrap the args in type id, but pass them in as they are", () => { - const ancestorMatcher = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandson883" - ] - } - }; - const currentMatcher = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandfather883" - ] - } - }; - const result = ExampleClass.detoxMatcherForBothAndAncestorMatcher(currentMatcher, ancestorMatcher); - - expect(result).toEqual({ - "target": { - "type": "Class", - "value": "GREYActions" - }, - "method": "detoxMatcherForBoth:andAncestorMatcher:", - "args": [ - { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandfather883" - ] - } - }, - { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandson883" - ] - } - } - ] - }); - }); - - it("should fail with wrongly formatted matchers", () => { - expect(() => { - const ancestorMatcher = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandson883" - ] - } - }; - const currentAction = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYAction" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandfather883" - ] - } - }; - ExampleClass.detoxMatcherForBothAndAncestorMatcher(currentAction, ancestorMatcher); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - const ancestorAction = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYAction" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandson883" - ] - } - }; - const currentMatcher = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYMatchers" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandfather883" - ] - } - }; - ExampleClass.detoxMatcherForBothAndAncestorMatcher(currentMatcher, ancestorAction); - }).toThrowErrorMatchingSnapshot(); - - expect(() => { - const ancestorMatcher = { - "type": "Invocation", - "value": { - "target": { - "type": "Class", - "value": "GREYAction" - }, - "method": "matcherForAccessibilityID:", - "args": [ - "Grandson883" - ] - } - }; - const currentMatcher = { - "type": "Invocation", - "value": { - "method": "matcherForAccessibilityID:", - "args": [ - "Grandfather883" - ] - } - }; - ExampleClass.detoxMatcherForBothAndAncestorMatcher(currentMatcher, ancestorMatcher); - }).toThrowErrorMatchingSnapshot(); - }); - }); - afterAll(() => { // Clean up remove.removeSync("./__tests__/generated"); diff --git a/generation/__tests__/helpers.js b/generation/__tests__/helpers.js deleted file mode 100644 index 04e5757829..0000000000 --- a/generation/__tests__/helpers.js +++ /dev/null @@ -1,13 +0,0 @@ -const { methodNameToSnakeCase } = require('../helpers'); - -describe("helpers", () => { - describe("methodNameToSnakeCase", () => { - it("should not fail with empty string", () => { - expect(() => methodNameToSnakeCase("")).not.toThrow(); - }); - - it("should return the correct snake case method name", () => { - expect(methodNameToSnakeCase("actionForScrollInDirection:amount:xOriginStartPercentage:yOriginStartPercentage:")).toMatchSnapshot(); - }); - }); -}); diff --git a/generation/earl-grey/index.js b/generation/earl-grey/index.js index 0f27be9e96..5d31be4cfe 100644 --- a/generation/earl-grey/index.js +++ b/generation/earl-grey/index.js @@ -1,5 +1,4 @@ const t = require("babel-types"); -const template = require("babel-template"); const objectiveCParser = require("objective-c-parser"); const generate = require("babel-generator").default; const fs = require("fs"); @@ -20,19 +19,6 @@ const isPoint = [ generateTypeCheck("number", { selector: "y" }) ]; const isOneOf = generateIsOneOfCheck; -const isGreyMatcher = ({ name }) => template(` - if ( - typeof ARG !== "object" || - ARG.type !== "Invocation" || - typeof ARG.value !== "object" || - typeof ARG.value.target !== "object" || - ARG.value.target.value !== "GREYMatchers" - ) { - throw new Error('${name} should be a GREYMatcher, but got ' + JSON.stringify(ARG)); - } -`)({ - ARG: t.identifier(name) - }) // Constants const SUPPORTED_TYPES = [ @@ -44,7 +30,6 @@ const SUPPORTED_TYPES = [ "NSString *", "NSString", "NSUInteger", - "id" ]; /** @@ -187,13 +172,8 @@ function addArgumentTypeSanitizer(json) { return json.type; } -// These types need no wrapping with {type: ..., value: } -const plainArgumentTypes = ["id"]; -function shouldBeWrapped({ type }) { - return !plainArgumentTypes.includes(type); -} function createReturnStatement(className, json) { - const args = json.args.map(arg => shouldBeWrapped(arg) ? + const args = json.args.map(arg => t.objectExpression([ t.objectProperty( t.identifier("type"), @@ -203,7 +183,7 @@ function createReturnStatement(className, json) { t.identifier("value"), addArgumentContentSanitizerCall(arg) ) - ]) : addArgumentContentSanitizerCall(arg) + ]) ); return t.returnStatement( @@ -234,13 +214,17 @@ function createTypeCheck(json) { "NSDate *": isNumber, GREYDirection: isOneOf(["left", "right", "up", "down"]), GREYContentEdge: isOneOf(["left", "right", "top", "bottom"]), - GREYPinchDirection: isOneOf(["outward", "inward"]), - "id": isGreyMatcher, + GREYPinchDirection: isOneOf(["outward", "inward"]) }; const typeCheckCreator = typeInterfaces[json.type]; const isListOfChecks = typeCheckCreator instanceof Array; + if (typeof typeCheckCreator !== "function" && !isListOfChecks) { + console.info("Could not find ", json); + return; + } + return isListOfChecks ? typeCheckCreator.map(singleCheck => singleCheck(json)) : typeCheckCreator(json); @@ -264,13 +248,10 @@ module.exports = function(files) { fs.writeFileSync(outputFile, code, "utf8"); // Output methods that were not created due to missing argument support - const unsupportedMethods = json.methods.filter(x => !filterMethodsWithUnsupportedParams(x)); - if (unsupportedMethods.length) { - console.log(`Could not generate the following methods for ${json.name}`); - unsupportedMethods.forEach(method => { - const methodArgs = method.args.filter(methodArg => !SUPPORTED_TYPES.includes(methodArg.type)).map(methodArg => methodArg.type); - console.log(`\t ${method.name} misses ${methodArgs}`); - }); - } + console.log(`Could not generate the following methods for ${json.name}`); + const unsupportedMethods = json.methods.filter(x => !filterMethodsWithUnsupportedParams(x)).forEach(method => { + const methodArgs = method.args.filter(methodArg => !SUPPORTED_TYPES.includes(methodArg.type)).map(methodArg => methodArg.type); + console.log(`\t ${method.name} misses ${methodArgs}`); + }); }); }; diff --git a/generation/fixtures/example.h b/generation/fixtures/example.h index 1ea0b904da..80b007678b 100644 --- a/generation/fixtures/example.h +++ b/generation/fixtures/example.h @@ -60,5 +60,4 @@ + (id)actionForScrollToContentEdge:(GREYContentEdge)edge; + (id)actionWithUnknownType:(WTFType *)wat; -+ (id)actionWithKnown:(NSUInteger)iknowdis andUnknownType:(WTFTypalike *)wat; -+ (id)detoxMatcherForBoth:(id)firstMatcher andAncestorMatcher:(id)ancestorMatcher; \ No newline at end of file ++ (id)actionWithKnown:(NSUInteger)iknowdis andUnknownType:(WTFTypalike *)wat; \ No newline at end of file diff --git a/generation/index.js b/generation/index.js index 16c8c46a61..404627dd50 100755 --- a/generation/index.js +++ b/generation/index.js @@ -1,9 +1,7 @@ #!/usr/bin/env node const generateEarlGreyAdapters = require("./earl-grey"); const files = { - "../detox/ios/EarlGrey/EarlGrey/Action/GREYActions.h": "../detox/src/ios/earlgreyapi/GREYActions.js", - "../detox/ios/Detox/GREYMatchers+Detox.h": "../detox/src/ios/earlgreyapi/GREYMatchers+Detox.js", - "../detox/ios/EarlGrey/EarlGrey/Matcher/GREYMatchers.h": "../detox/src/ios/earlgreyapi/GREYMatchers.js", + "../detox/ios/EarlGrey/EarlGrey/Action/GREYActions.h": "../detox/src/ios/earlgreyapi/GREYActions.js" }; generateEarlGreyAdapters(files); diff --git a/generation/package.json b/generation/package.json index 465365c106..89b3dc777b 100644 --- a/generation/package.json +++ b/generation/package.json @@ -15,7 +15,7 @@ "babel-types": "^6.25.0", "jest": "^20.0.4", "lerna": "2.0.0-rc.4", - "objective-c-parser": "1.1.0", + "objective-c-parser": "1.0.4", "remove": "^0.1.5" }, "jest": { @@ -34,7 +34,6 @@ } }, "dependencies": { - "babel-generate-guard-clauses": "^2.0.0", - "babel-template": "^6.26.0" + "babel-generate-guard-clauses": "^0.1.0" } -} \ No newline at end of file +}