// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_TESTING_EARL_GREY_BASE_EG_TEST_HELPER_IMPL_H_
#define IOS_TESTING_EARL_GREY_BASE_EG_TEST_HELPER_IMPL_H_
#import <Foundation/Foundation.h>
@class EarlGreyImpl;
// Public macro to use in test helpers methods. Usage example:
//
// @interface MyEarlGreyImpl : BaseEGTestHelperImpl
// @end
// @implementation MyEarlGreyImpl
// + (void)loadURL:(const GURL&)URL {
// NSString* spec = base::SysUTF8ToNSString(URL.spec());
// EG_TEST_HELPER_ASSERT_NO_ERROR(LoadUrl(spec));
// }
// @end
//
// In this example LoadUrl() must return NSError* on failure and nil on success
// and MyEarlGreyImpl has to be a subclass of BaseEGTestHelperImpl.
//
#define EG_TEST_HELPER_ASSERT_NO_ERROR(__expression) \
[self failWithError:__expression expression:@"" #__expression];
// Public macro to use in test helpers methods. Usage example:
//
// @interface MyEarlGreyImpl : BaseEGTestHelperImpl
// @end
// @implementation MyEarlGreyImpl
// - (void)waitForLoadCompletion {
// EG_TEST_HELPER_ASSERT_TRUE(WaitForLoadCompletion(),
// @"Waiting for load completion");
// }
// @end
//
// In this example WaitForLoadCompletion() must return bool indicating success
// and MyEarlGreyImpl has to be a subclass of BaseEGTestHelperImpl.
//
#define EG_TEST_HELPER_ASSERT_TRUE(__expression, __description) \
[self fail:!(__expression) \
expression:@"" #__expression \
description:__description];
// Base class used for logging the failure. Compiled in Test Process for EG2 and
// EG1. Must not be instantiated directly.
@interface BaseEGTestHelperImpl : NSObject
// Creates BaseEGTestHelperImpl object with preset file name and line number for
// failure. Must be invoked by helper macro and not called directly.
+ (instancetype)invokedFromFile:(NSString*)fileName lineNumber:(int)lineNumber;
- (instancetype)init NS_UNAVAILABLE;
// Raises EarlGrey exception if |error| argument is not nil.
// |error.localizedDescription| is used as exception reason.
// Invoked by EG_TEST_HELPER_ASSERT_NO_ERROR macro and must not be called
// directly.
- (void)failWithError:(NSError*)error expression:(NSString*)expression;
// Raises EarlGrey exception if |fail| argument is YES.
// |description| is used as exception reason.
// Invoked by EG_TEST_HELPER_ASSERT_TRUE macro and must not be called
// directly.
- (void)fail:(BOOL)fail
expression:(NSString*)expression
description:(NSString*)description;
// Underlying EarlGreyImpl object created with file and line number passed to
// invokedFromFile:lineNumber:. Subclasses can use this object instead of
// calling methods on EarlGrey to produce exceptions with correct file and line
// numbers.
- (EarlGreyImpl*)earlGrey;
@end
#endif // IOS_TESTING_EARL_GREY_BASE_EG_TEST_HELPER_IMPL_H_