How to use OCMock to return different result base on different argument - ocmock

I am trying to mock different method return when passing different argument for the same method.
self.myMock = [OCMockObject mockForClass:[MyClass class]];
[[[self.myMock expect] andReturnValue:5] myStaticMethod:3];
[[[self.myMock expect] andReturnValue:10] myStaticMethod:6];
But it only takes the first one, when argument is 3 then return 5, and when argument is 6, it return nil instead of 10. Does anyone know whether is a way to test this?
the real code:
-(NSMutableArray*)convertChildStringToChildDic:(NSString*)strchildren
{
NSArray *kididarray = [strchildren componentsSeparatedByString:#","];
//处理小孩信息
/*children = (
{
avatarSmall = "<null>";
currentStatus = 0;
displayName = stu1;
"id_str" = "70938032-3811-e411-946a-005056c00008";
title = Child;
}
)*/
NSMutableArray *rstchildarray = [NSMutableArray arrayWithCapacity:1];
for (NSString *enrollment_id in kididarray) {
if (enrollment_id.length <= 0) {
continue;
}
**NSMutableDictionary *mdic = [[RoomInfoManager sharedManager] getKidDictionaryByID:enrollment_id];**
[mdic setValue:enrollment_id forKey:#"id_str"];
if (mdic != nil) {
[rstchildarray addObject:mdic];
}
}
return rstchildarray;
}
Test:
-(void) testconvertChildStringToChildDic_InvalidAgruments {
NSMutableDictionary *childdic = [[NSMutableDictionary alloc] init];
childdic[#"id"] = #"josh";
NSMutableDictionary *childdic1 = [[NSMutableDictionary alloc] init];
childdic1[#"id"] = #"joy";
id mockRIM = OCMClassMock([RoomInfoManager class]);
**OCMStub([mockRIM getKidDictionaryByID:#"josh"]).andReturn(childdic);
**OCMStub([mockRIM getKidDictionaryByID:#"joy"]).andReturn(childdic1);****
RoomInfoManager *roomInfoMgr = [RoomInfoManager alloc];
id mockPartialRIM = OCMPartialMock(roomInfoMgr);
OCMExpect([mockPartialRIM sharedManager]).andReturn(mockRIM); // use expect
NSString *childStr = #"josh,joy";
NSMutableArray *childarray = [[ReportOperator alloc] convertChildStringToChildDic:childStr];
NSDictionary *childrenArraydic = #{#"id" : #"josh", #"id_str": #"josh"};
NSMutableArray *resultArray = [NSMutableArray arrayWithObjects:childrenArraydic, nil];
[mockPartialRIM verify]; // verify expect,验证该对像是否被调用。
XCTAssertEqualObjects(childarray, resultArray);
}
the second call
OCMStub([mockRIM getKidDictionaryByID:#"joy"]).andReturn(childdic1);
does not seem take effect and return nil instead.

Related

Pay U IOS SDK 3.2 Seamless Integration - Mandatory Parameter FURL missing

I am new to Payment gateway integration. I am integrating the latest PAY U SDK version 3.2 seamless in my App. I am following the code as per the sample App.
I have the key and salt values.
But the Payment is not happening and it always throws an error as mandatory parameter furl is missing. What am i doing wrong.
I am filling in the surl and furl and then creating the request.
should i add something in the project plist file.
I am using xcode 6.3 , ios 8.3 and running on simulator
/Generate the random transaction id/
NSString *letters = #"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
NSMutableString *randomString = [NSMutableString stringWithCapacity: 15];
for (int i=0; i<15; i++) {
[randomString appendFormat: #"%C", [letters characterAtIndex: arc4random_uniform((u_int32_t)[letters length])]];
}
self.paymentParamForPassing = [PayUModelPaymentParams new];
self.paymentParamForPassing.key = #"gtKFFx";//#"gtKFFx";
self.paymentParamForPassing.transactionID = #"Ywism0Q9XC88qvy";
self.paymentParamForPassing.amount = #"1";//[#(self.amountToPay) stringValue];
self.paymentParamForPassing.productInfo = #"Nokia";//[NSString stringWithFormat:#"%#-%#_%#",self.selectedDeal.title,self.displayCheckInDate,self.displayCheckOutDate];
self.paymentParamForPassing.firstName = #"Ram";//self.currentUser.name;
self.paymentParamForPassing.email = #"email#testsdk1.com";//self.currentUser.email;
self.paymentParamForPassing.userCredentials = #"ra:ra";
self.paymentParamForPassing.phoneNumber = #"1111111111";
self.paymentParamForPassing.SURL = #"https://payu.herokuapp.com/ios_success";
self.paymentParamForPassing.FURL = #"https://payu.herokuapp.com/ios_failure";
self.paymentParamForPassing.udf1 = #"u1";
self.paymentParamForPassing.udf2 = #"u2";
self.paymentParamForPassing.udf3 = #"u3";
self.paymentParamForPassing.udf4 = #"u4";
self.paymentParamForPassing.udf5 = #"u5";
self.paymentParamForPassing.environment = ENVIRONMENT_MOBILETEST;
self.paymentParamForPassing.offerKey = #"test123#6622";
self.paymentParamForPassing.hashes.paymentHash = #"ade84bf6dd9da35d0aab50a5bf61d6272ab0fc488b361b65c66745054aacf1900e3c60b5022d2114bae7360174ebcb3cd7185a5d472e5c99701e5e7e1eccec34";
self.paymentParamForPassing.hashes.paymentRelatedDetailsHash = #"915299224c80eff0eb2407b945a5087556292f58baca25fd05a0bceb6826aa9eb531810001dd4b4677dd928dd60d39eecf843b2189f213f9bb82c5a9483e3aac";
self.paymentParamForPassing.hashes.VASForMobileSDKHash = #"5c0314c2781876f7e0a53676b0d08e1457dafe904d2d15d948626b57409538d51093eef4f15c792b1b9651be7b5659efdd45926e43a1145d68cea094687011ca";
self.paymentParamForPassing.hashes.deleteUserCardHash = #"03e10e892005755f91061121036fb1b10f46202b4138d182f153c5de5c7fd44930ed94b32fac230e59bac1e4ca123aca3297e4b9d25024bf13237db9721fec1a";
self.paymentParamForPassing.hashes.offerHash = #"1e99fdb59bd91c1a85624104c0fcfae34d7fcb850dd17a0b75e7efe49857d15fdefc47dd0d86ca34cbc3a8b580839aea6341a573e4e60dc1ddcf7ecc32bf9cae";
self.paymentParamForPassing.expiryYear = #"2019";
self.paymentParamForPassing.expiryMonth = #"12";
self.paymentParamForPassing.nameOnCard = #“NOC”;//self.selectedCard.cardHolderName;
self.paymentParamForPassing.cardNumber = #"5123456789012346";//self.selectedCard.cardNumber;
self.paymentParamForPassing.CVV = #"123";//self.selectedCard.cvc;
//self.paymentParamForPassing.saveStoreCard = #"1";
self.paymentParamForPassing.storeCardName = #"My TestCard";
self.createRequest = [PayUCreateRequest new];
[self.createRequest createRequestWithPaymentParam:self.paymentParamForPassing forPaymentType:PAYMENT_PG_CCDC withCompletionBlock:^(NSMutableURLRequest *request, NSString *postParam, NSString *error) {
if (error == nil) {
UIStoryboard *stry = [UIStoryboard storyboardWithName:#"MainStoryboard" bundle:nil];
PayUMoneyViewController *PVC = (PayUMoneyViewController *)[stry instantiateViewControllerWithIdentifier:#"PVC"];
PVC.theRequest = request;
NSLog(#"TheRequest: %#", request);
[self.navigationController pushViewController:PVC animated:true];
}
else{
NSLog(#"URL request from createRequestWithPostParam: %#",request);
NSLog(#"PostParam from createRequestWithPostParam:%#",postParam);
NSLog(#"Error from createRequestWithPostParam:%#",error);
[[[UIAlertView alloc] initWithTitle:#"ERROR" message:error delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil, nil] show];
}
}];
Please let me know if anybody has integrated the PAYU IOS SDK seamless 3.2

ios NSAttributedString firstLineHeadIndent bug

I try to use FirstLineHeadIndent,but when i use, The string will be truncated.
NSString *string = #"hello,i am aaa,123456 my name is";
UIFont *textFont = [UIFont systemFontOfSize:15];
self.textView = [UILabel new];
_textView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_textView];
_textView.numberOfLines = 0;
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.lineHeightMultiple = 1.4;
[paragraphStyle setLineSpacing:4];
[paragraphStyle setFirstLineHeadIndent:30];
[paragraphStyle setAlignment:NSTextAlignmentJustified];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:string attributes:#{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:textFont,NSForegroundColorAttributeName:[UIColor darkGrayColor]}];
[_textView setAttributedText:string];
The results of the intercept is hello,i am aaa,123456 my.
about the first line retract, am i wrong? thanks!

UILabel detect line breaks

I am currently using a UILabel to display multiple lines of text. The line break most is set to NSLineBreakByWordWrapping so the the label automatically inserts line breaks. How can I detect where those line breaks are? Basically, I want to return a string with each \n break included.
Here is my work around for detecting line breaks inside UILabel
- (int)getLengthForString:(NSString *)str fromFrame:(CGRect)frame withFont:(UIFont *)font
{
int length = 1;
int lastSpace = 1;
NSString *cutText = [str substringToIndex:length];
CGSize textSize = [cutText sizeWithFont:font constrainedToSize:CGSizeMake(frame.size.width, frame.size.height + 500)];
while (textSize.height <= frame.size.height)
{
NSRange range = NSMakeRange (length, 1);
if ([[str substringWithRange:range] isEqualToString:#" "])
{
lastSpace = length;
}
length++;
cutText = [str substringToIndex:length];
textSize = [cutText sizeWithFont:font constrainedToSize:CGSizeMake(frame.size.width, frame.size.height + 500)];
}
return lastSpace;
}
-(NSString*) getLinebreaksWithString:(NSString*)labelText forWidth:(CGFloat)lblWidth forPoint:(CGPoint)point
{
//Create Label
UILabel *label = [[UILabel alloc] init];
label.text = labelText;
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
//Set frame according to string
CGSize size = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(lblWidth, MAXFLOAT)
lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake(point.x , point.y , size.width , size.height)];
//Add Label in current view
[self.view addSubview:label];
//Count the total number of lines for the Label which has NSLineBreakByWordWrapping line break mode
int numLines = (int)(label.frame.size.height/label.font.leading);
//Getting and dumping lines from text set on the Label
NSMutableArray *allLines = [[NSMutableArray alloc] init];
BOOL shouldLoop = YES;
while (shouldLoop)
{
//Getting length of the string from rect with font
int length = [self getLengthForString:labelText fromFrame:CGRectMake(point.x, point.y, size.width, size.height/numLines) withFont:label.font] + 1;
[allLines addObject:[labelText substringToIndex:length]];
labelText = [labelText substringFromIndex:length];
if(labelText.length<length)
shouldLoop = NO;
}
[allLines addObject:labelText];
//NSLog(#"\n\n%#\n",allLines);
return [allLines componentsJoinedByString:#"\n"];
}
How to use
NSString *labelText = #"We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.";
NSString *stringWithLineBreakChar = [self getLinebreaksWithString:labelText forWidth:200 forPoint:CGPointMake(15, 15)];
NSLog(#"\n\n%#",stringWithLineBreakChar);
You just need to set parameters required by getLinebreaksWithString and you will get a string with each "\n" break included.
OutPut
Here is my solution to this problem.
I iterate through all whitespace characters in the provided string, set substrings (from beginning to current whitespace) to my label and check the difference in the height. When the height changes I insert a new line character (simulates a line break).
func wordWrapFormattedStringFor(string: String) -> String {
// Save label state
let labelHidden = label.isHidden
let labelText = label.text
// Set text to current label and size it to fit the content
label.isHidden = true
label.text = string
label.sizeToFit()
label.layoutIfNeeded()
// Prepare array with indexes of all whitespace characters
let whitespaceIndexes: [String.Index] = {
let whitespacesSet = CharacterSet.whitespacesAndNewlines
var indexes: [String.Index] = []
string.unicodeScalars.enumerated().forEach { i, unicodeScalar in
if whitespacesSet.contains(unicodeScalar) {
let index = string.index(string.startIndex, offsetBy: i)
indexes.append(index)
}
}
// We want also the index after the last character so that when we make substrings later we include also the last word
// This index can only be used for substring to this index (not from or including, since it points to \0)
let index = string.index(string.startIndex, offsetBy: string.characters.count)
indexes.append(index)
return indexes
}()
var reformattedString = ""
let boundingSize = CGSize(width: label.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let attributes = [NSFontAttributeName: font]
var runningHeight: CGFloat?
var previousIndex: String.Index?
whitespaceIndexes.forEach { index in
let string = string.substring(to: index)
let stringHeight = string.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: attributes, context: nil).height
var newString: String = {
if let previousIndex = previousIndex {
return string.substring(from: previousIndex)
} else {
return string
}
}()
if runningHeight == nil {
runningHeight = stringHeight
}
if runningHeight! < stringHeight {
// Check that we can create a new index with offset of 1 and that newString does not contain only a whitespace (for example if there are multiple consecutive whitespaces)
if newString.characters.count > 1 {
let splitIndex = newString.index(newString.startIndex, offsetBy: 1)
// Insert a new line between the whitespace and rest of the string
newString.insert("\n", at: splitIndex)
}
}
reformattedString += newString
runningHeight = stringHeight
previousIndex = index
}
// Restore label
label.text = labelText
label.isHidden = labelHidden
return reformattedString
}
Image - Comparison of output string with label text.
This solution worked really well in my case, hope it helps.

Solution for Paypal Error 589023 in iphone application

This is the Resolution for Paypal (Sandbox) Error "589023" in iPhone Application
-(void)payWithPayPal{
for (int i=0;i
PayPal *payPal=[PayPal getPayPalInst];
payPal.shippingEnabled = FALSE;
payPal.dynamicAmountUpdateEnabled = NO;
payPal.feePayer = FEEPAYER_EACHRECEIVER;
PayPalPayment *payment = [[[PayPalPayment alloc] init] autorelease];
payment.recipient = #"UKMCA2010#GMAIL.COM";
payment.paymentCurrency = #"USD";
payment.description = #"Payment Discription here...";
SampleSingleton *sample=[SampleSingleton sharedInstance];
payment.merchantName =[sample getStrRestaurantName];
payment.invoiceData = [[[PayPalInvoiceData alloc] init] autorelease];
payment.invoiceData.invoiceItems = [NSMutableArray array];
PayPalInvoiceItem *item = [[PayPalInvoiceItem alloc] init];
item.totalPrice=[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:#"%.2f", 126.34545]]; // If u give xxx.xx , no need to give the %.2f , u can give directly %f
item.name = objTempReceived.strItemName;
item.itemId = #"Item ID";
[payment.invoiceData.invoiceItems addObject:item];
[item release];
}
payment.subTotal = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:#"%.2f",126.34545]]; //Total and Subtotal must be equal
payment.invoiceData.totalTax = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:#"%.2f",3.34]];
NSLog(#"Total Tax is :%#",[payment.invoiceData.totalTax stringValue]);
[payPal checkoutWithPayment:payment];
}
Here the total and subtotal and Tax allows only two digits after the .(dot) Ex: (234.xx). So by using the %.2f to work perfectly.

Dynamics AX 2009 X++ Selecting A Date Range

I am creating an X++ report, and the requirement is that the user can multi-select on a form and when they click the report menu button the values are pulled in based on the selection.
So far this is easy enough, and I can pull in Str ranges i.e. order numbers, item id's etc, but I want to be able to pull in a date range based on selection.
I have used a method which several MorphX reports use, with use of 3 key methods in X++ reporting;
setQuerySortOrder
setQueryEnableDS
and the main key one which is;
setQueryRange
The code for setQuery Range is as follows;
private void setQueryRange(Common _common)
{
FormDataSource fds;
LogisticsControlTable logisticsTable;
QueryBuildDataSource qbdsLogisticsTable;
QueryBuildRange qbrVanRun;
str rangeVanRun;
QueryBuildRange qbrLogId;
str rangeLogId;
QueryBuildRange qbrExpStartDate;
str rangeExpStartDate;
set vanRunSet = new Set(Types::String);
set logIdSet = new Set(Types::String);
set expStartDate = new Set(Types::Date);
str addRange(str _range, str _value, QueryBuildDataSource _qbds, int _fieldNum, Set _set = null)
{
str ret = _range;
QueryBuildRange qbr;
;
if(_set && _set.in(_Value))
{
return ret;
}
if(strLen(ret) + strLen(_value) + 1 > 255)
{
qbr = _qbds.addRange(_fieldNum);
qbr.value(ret);
ret = '';
}
if(ret)
{
ret += ',';
}
if(_set)
{
_set.add(_value);
}
ret += _value;
return ret;
}
switch(_common.TableId)
{
case tableNum(LogisticsControlTable):
qbdsLogisticsTable = element.query().dataSourceTable(tableNum(LogisticsControlTable));
qbrVanRun = qbdsLogisticsTable.addRange(fieldNum(LogisticsControlTable, APMServiceCenterID));
qbdsLogisticsTable = element.query().dataSourceTable(tableNum(LogisticsControlTable));
qbrLogId = qbdsLogisticsTable.addRange(fieldNum(LogisticsControlTable, LogisticsId));
// qbdsLogisticsTable = element.query().dataSourceTable(tableNum(LogisticsControlTable));
// qbrExpStartDate = qbdsLogisticsTable.addRange(fieldNum(LogisticsControlTable, APMExpDateJobStart));
fds = _common.dataSource();
for(logisticsTable = fds.getFirst(true) ? fds.getFirst(true) : _common;
logisticsTable;
logisticsTable = fds.getNext())
{
rangeVanRun = addrange(rangeVanRun, logisticsTable.APMServiceCenterID, qbdsLogisticsTable, fieldNum(LogisticsControlTable, APMServiceCenterID), vanRunSet);
rangeLogID = addrange(rangeLogID, logisticsTable.LogisticsId, qbdsLogisticsTable, fieldNum(LogisticsControlTable, LogisticsId), logIdSet);
// rangeExpStartDate = addrange(rangeExpStartdate, logisticsTable.APMExpDateJobStart, qbdsLogisticsTable, fieldNum(LogisticsControlTable, APMExpDateJobStart), expStartDate);
}
qbrLogId.value(rangeLogID);
qbrVanRun.value(rangeVanRun);
break;
}
}
Use queryValue to format your dates correctly for the query:
set expStartDate = new Set(Types::String);
rangeExpStartDate = addrange(rangeExpStartdate, queryValue(logisticsTable.APMExpDateJobStart), qbdsLogisticsTable, fieldNum(LogisticsControlTable, APMExpDateJobStart), expStartDate);

Resources