text:
Bruce specializes in translating technology and technical materials into business English. He conveys difficult materials in a manner that is easy to comprehend and understand.
He is a thorough researcher and quick study, able to find materials on nearly any subject and convert it into meaningful content for the reader.
He focuses on delivering a message that is readable by everyone yet targeted at decision makers who understand "bottom line" terminology.
He has created marketing collateral from scratch including content, images and packaging.
He also is a "power user" of Microsoft Word, Excel, Power Point, Publisher, Project Manager and more.
Although a sales person at heart, he is highly technical and able to articulate a message that all readers can understand and act upon.
Writing! Bruce loves to research and write on virtually any topic. Sales, marketing, website development, technology in general, computers, business networking, all sports (high school and college football and basketball player), golf (50 years) guitar (40 years), avid reader of business books, follows emerging technologies, student of business in all forms.
Married for over 40 years, father of 3 daughters and "Papa" to six grandchildren.
Bruce concentrated on developing a good understanding of the world of business with course work in management, accounting, economics, finance, law and organizational development.
Although no longer fluent, Bruce L. participated in an intensive 9 month 5 days a week 8 hours a day Russian Language program while in the U.S. Air Force. He received a Top Secret Security Clearance and monitored Russian Air to Ground communication while stationed in Berlin, Germany.
Bruce L. has been translating technology into "Business English" since 1975. He prides himself on being able to understand the underlying technology in computers, telecommunications, networking, software and then boil these technical concepts down into what really matters, answering questions like:
"What is the bottom line?"
"How will this help my business?"
"Will this save me money and how?"
He can take computers apart and put them back together again. He understands business analysis, software development, project management, networking - virtually everything there is to know about computers. networking and systems.
As the founder and managing partner of a website development company, Bruce L. created website content for well over 250 different clients in about 50 different industry segments.
He and his staff conducted interviews, completed competitive and background research and then created an average of 10-15 original content web pages for each client.
Bruce L has created white papers, brochures, online marketing articles, rack cards, emails and more. He has been creating marketing materials of all kinds since 1988 in both corporate and small business environments. He uses Microsoft Word, Publisher, Power Point and other tools.
Bruce L. has minored in Finance in college and has been very actively involved in the investment community for many years. He worked in a bank for two years and has two active projects where he is converting technical industry jargon into what he calls "Business English." In another project he is providing materials about private equity and other alternative investment vehicles to prospective investors. The sample article explains "real asset" classes that are available from one client.
Bruce developed business plans and marketing collateral for over 10 separate businesses from 1995 to the present. He developed power point presentations, PDF documents, marketing brochures, press releases and more.
During that time, he honed his ability to deliver a "clear and powerful message" to promote his own businesses and the clients he represented.
Bruce L. has created countless brochures, marketing articles and web pages for technology companies over the years.
He has a proven ability to translate technology into business English with a focus on delivering high impact, bottom line messages to decision makers.
Bruce L. has been selling software and services for over 25 years. He created website content for several software development companies and as a broad understanding of the industry.
Bruce L. created all the website content for two companies in the construction industry. One was a Design/Build Architect Contractor and the other specialized in retail build outs. He researched, interviewed and created the entire content for 20-25 page websites.
As a founding member of a call center, Bruce L. set appointments for over 50 insurance agents. As part of the work he did for the agencies, he created scripts about commercial property and casualty insurance. His father was also and Independent Insurance Agent so he is well versed in the terminology of the industry.
As a business owner since 1998, Bruce L. is familiar with all aspects of creating and managing a business. This certainly includes setting up administrative functions, bookkeeping, personnel policies, employee handbooks, phone systems, training manuals and more.
Bruce L. was responsible for creating sales and marketing plans that targeted high end manufacturing companies like Carrier Air Conditioning, Aluminum Company of America, Eastman Kodak and others.
During that time, he developed a very good understanding of the terminology associated with both discrete and process manufacturing.
He worked with engineering departments on CAD/CAM, manufacturing departments on process control systems, ERP and more. He worked at all levels from user to senior level executive.
He was treated to countless manufacturing plant tours and learned virtually everything about how to smelt aluminum and manufacture air conditioners and film processing equipment.
Bruce L. has written several articles for several different attorneys. Several were focused on malpractice, others were about Maritime Law and DWI. He studied law in college and as a small business owner, created many contracts.
Bruce L. had a major utility as a customer while working for Digital Equipment many years ago. As such, he was exposed to many aspects of the industry including process control in a nuclear plant, the use of advanced technology in monitoring centers and more. He has also worked with all types of utility contractors including HVAC, Plumbing, Electrical and Mechanical Contractors.
While working with these contractors he developed an understanding of what is important to them and their clients. Clients want reliable, on time service. He has also completed several recent assignments relating to the Oil and Gas Industry. One of these article focused on some of the industries that are emerging from fracking operations. (See example)
Bruce L. has been involved in high technology sales for over 25 years and has witnessed dramatic changed in the electronics industry. He prides himself on being able to translate technical jargon into what he calls "Business English". He understands the electronics industry from the circuit board to the cell tower and everything in between. In one recdent article he explained how advanced fixturing is streamlining Surface Mount Technology and the Printed Circuit Board industry. He has also written several articles in recent weeks about how electronics are now being miniaturized and embedded in everything pacemakers and pill sized cameras that when swallowed travel through the digestive and send back real time images.
As the founder and managing partner in a Website Development company, Bruce L. created website content for multiple consumer goods companies including a vineyard, a natural food store, an online jewelry store, an auto parts company and more.
Bruce L. recently completed an assignment to assess how recent technology advancements may effect the pharmaceutical industry. There are several technologies converging; mobile computing (smart phones and tablet computers), cloud computing, embedded devices, BYOD (Bring Your Own Device) and the Internet of Things (IoT).The combined impact of these technologies is changing how virtually every industry must approach the future. Pharma is no exception. Miniaturization of integrated circuits will impact data collection, clinical trials, delivery methods and more.
Bruce L. was a high school and college athlete primarily competing in Basketball, Football and Golf. He was the MVP for Golf and Basketball, all conference for Basketball and Football and District Champion for Golf his senior year in high school. He is a baseball, golf, football and basketball fan at all levels. He has also coached, played golf for nearly 40 years and worked in a golf pro shop for two years.
Bruce L. recently completed as assignment to asses the impact of gamification on education. As reported by The Guide to Online Schools, "6.7 million students have enrolled in at least one online course during the fall 2011 term. That's nearly one-third of all students currently enrolled in some sort of higher education. That's 570,000 more students than the previous year."
Bruce L. worked in the marketing department of First Bank System for two years. He also worked in the check processing department for two years while attending college. He came to understand Demand Deposit, Loans Processing, Savings and other facets of the industry.
Then worked with the Executive Vice President and Senior Vice President of Marketing for a billion dollar Bank Holding Company to introduce a new product offering. Although very young and green, he learned a great deal about banking and marketing during his time in that position.
Bruce L. is working with a client who wants to encourage his followers to purchase products manufactured in the U.S. and Canada because of the positive impact on the economy and the environment. As part of the research for this project he identified multiple sources of information to support green living. He also researched green building and came very close to living a totally green community at one time but it was unfortunately too far away from metro areas and transportation.
Bruce L. is working with a client who wants to encourage his followers to purchase products manufactured in the U.S. and Canada because of the positive impact on the economy and the environment. As part of the research for this project he identified multiple sources of information to support green living. He also researched green building and came very close to living a totally green community at one time but it was unfortunately too far away from metro areas and transportation.
Bruce has worked with many individuals over the years mentoring them in their career choices and strategies. Part of that effort included the creation and editing of resumes and cover letters.
Bruce L. is an avid student of sales motivation and has created several presentations over the years. He has conducted over 50 sales seminars during his career many with the them of self improvement. His most recent event was "Tips for Growing Your Business in a Down Economy." He conceptualized and created the seminar that was attended by over 75 business owners.
Bruce L. has created 100's of blog posts for multiple clients over the years. They vary from short concise, high impact articles to longer articles designed to provide information and education.
Bruce writes concise articles that tell a story. He delivers a clear and powerful message translating technical jargon into business English.
Once he understands the goal of the article, he conducts research, collects relevant information and weaves the collected information into his story.
He captures the attention of the intended audience, draws them into his story and delivers a clear call to action.
In 2001, Bruce's Hematologist told him he had six months to live and to "get his affairs in order." He and his wife developed "A Personal Wellness Plan" that saved his life.
"Aplastic Anemia and Autoimmune Diseases" describes the plan, dealing with the illness and offers advice to others.


text:
Free Shipping 48 Contiguous US States
The item you are trying to purchase is currently out of stock.Please enter your name, email, and phone number below. We will contact you as soon as this product is available.
Boston College Eagles Folding Picnic Table Black with Seats by Picnic Time is perfect for those tailgating parties, outdoor study sessions or picnics, or to use as a table in your dorm room. It is made with high strength aluminum alloy frame and ABS plastic. It folds for easy storage under your dorm bed. You can carry it anywhere in its portable suitcase form. Definitely a multi-use Dorm Smart Product!

subset: commoncrawl


text:
The other night was an average night in the world according to me. The kids were in bed and I:
*Plopped onto the couch and kicked my feet up on the coffee table,
*Sipped my glass of wine,
*Noticed a baseball game on tv,
*Felt my eyelids begin to droop as I slipped into a semi-comatose state. Baseball has the magical abiliy to transform me from a chatty and energetic KathyB! into a catatonic lump in nothing flat.
KathyB! What a shame! What did the park used to be called?
Pat: What are you talking about?!
KathyB! You know... Like when they changed Candlestick Park to 3Com Park... I like the old, traditional park names much better. Besides who can even keep up with all the names. Didn't they change Candlestick to Monster Park...?
Pat: That was years ago, Kathy. It's still Candlestick. And what are you talking about?!?
KathyB!: (a tad of annoyance creeping into her voice) Chan Ho Park. What was the original name?
Pat: (an equal amount of annoyance in his voice) What.... ?!
Pat: The pitcher is Chan Ho Park. They're playing at Yankee Stadium.


text:
I have not played in years and was looking to see if there was anyone out there interested in hitting some balls on the weekend to get some exercise. I live in Hollywood area. Since I haven't played in years I'm not sure what my skill level is anymore. Anyone who is interested just let me know
Views: 104
Replies to This Discussion
Hey Maria,
I hit and play sets with a bunch of guys in Almansor Park at Alhambra every monday, wednesday & friday after 4:30 pm. Here's the address for the park: 800 South Almansor Street Alhambra, CA 9180. Hope you can make it one of these days.
I haven't played for a few months and would also like to get back into tennis. I used to be about a 4.0 and live in Beverlywood.
If interested, feel free to email me back.
Hi Maria,
I'm open to hitting this weekend. Plummer Park sounds like it would work for
both of us. Let me know:-)
© 2019 Created by Mark / The Mayor. Powered by


text:
Clara B. Price Yentzer
Clara B. Price Yentzer, 88, formerly of Tiffin and Sycamore, died at 12:30 a.m. Sunday, May 26, 2013, at Wyandot County Skilled Nursing and Rehabilitation Center, Upper Sandusky.
She was born June 10, 1924, in Cottageville, W.Va., daughter of Hosa J. and Nancy C. (Sayre) Shinn. She married Harold J. Price March 15, 1947, and he preceded her in death in 1965. She married Alfred J. Yentzer and he also preceded her in death in 2009.
Surviving are two sons, Dana (Sharon) Price of Carey and Don (Karen) Price of McCutchenville; two grandsons, Kenneth (Meredith) Price of Tiffin and Ryan (Monica) Price of Republic; four granddaughters, Sharon Stover, Nancy Price and Beth Price, all of McCutchenville and Bonnie (Josh) Allen of Honolulu, Hawaii; seven great-grandchildren; a granddaughter-in-law, Heather Price; a sister, Margaret Hill of Mount Alto, W.Va.; two stepchildren, Dana (Lorraine) Yentzer of Tucson, Ariz., and Sherry DeHaan of Ft. Lauderdale, Fla.; five stepgrandchildren, Kip, Amy, Zachary, Jordan and Steve; and 10 stepgreat-grandchildren.
Also preceding her in death were her parents; five brothers, Early, Arnold, Darrel, Daniel and Clark Price; and three sisters, Gladys McIntyre, Naomi Sayre and Olive Campbell.
Clara was an instructor at Tiffin Academy of Hair Design for 17 years. She attended Sycamore United Methodist Church and Emanuel United Methodist Church, Melbourne, Fla.
A graveside service will be at later date at Pleasant View Cemetery, Sycamore.
Arrangements are being handled by Stombaugh-Batton Funeral Home, Carey, (419) 396-7520.
Online condolences may be sent to www.stombaughbatton.com.
Clara B. Price Yentzer
Clara B. Price Yentzer, 88, formerly of Tiffin and Sycamore, died Sunday, May 26, 2013, at Wyandot County Skilled Nursing and Rehabilitation Center, Upper Sandusky.
Arrangements are pending at Stombaugh-Batton Funeral Home, Carey.


text:
"Beauty is more than just flawless makeup!"
Join us in dicussion ranging from bath products to clearing your skin. Tip to toe discuss taking care of your body!
Use this control to limit the display of threads to those newer than the specified time frame.
Allows you to choose the data by which the thread list will be sorted.
Order threads in...
Note: when sorting by date, 'descending order' will show the newest results first.
Forum Rules


text:
Tuesday, December 1, 2009
Olive Bread
The recipe takes more than 12 hours from start to finish, but the hands on time is minimal. The night before baking the bread, I combined bread flour, yeast, olives, and water. After covering the mixture and letting the yeast work its magic overnight, I worked the dough into two loaves, and placed them on a lightly oiled baking sheet to rise for a couple more hours.
Then it was time to bake the bread. While the recipe said to put the dough in a preheated pot to bake, I didn't want to bake any of my pots in the oven. So, instead, I preheated the oven to 400F, placed the loaves (still on the oiled baking sheet) inside, then reduced the heat to 375F and baked them until their crusts were golden and an inserted thermometer read 210F (a method I borrowed from Mark Bittman's How To Cook Everything Vegetarian).
The recipe yielded two good-sized loaves of olive bread. I used the first to make some toasted sandwiches with provolone and chopped peppers. (A similar sandwich, made with regular bread, can be found here.) Since I was about to leave town for Thanksgiving, I put the second loaf in the freezer -- I'm pleased to report that it emerged from the icebox with the same "fresh baked" texture it had when it went in, and that I'll be enjoying more olive bread sandwiches this week.
8 comments:
- kat said...
oh this looks delicious. i also love olives. and i love bread. therefore i love olive bread.
- December 2, 2009 at 12:55 AM
- Monica said...
Wow, that bread looks incredible. I want your sandwich! I usually keep my bread pretty basic (sometimes I'll add seeds... and once I was even so bold as to add raisins). But this makes me think I need to get a little more creative.
- December 6, 2009 at 1:14 AM
- Simply Life said...
Oh my gosh this looks like the most amazing bread to use in a sandwich!
- December 6, 2009 at 5:10 PM
- Olga said...
I used to hate olives...that was a long time ago: the bread and the sandwich look great!
- December 6, 2009 at 7:46 PM
- Thessa said...
This post definitely triggered a craving for olive bread!
- December 8, 2009 at 8:45 PM
- www.dhaleb.com said...
Wow! I've never made my own bread before and this looks scrumptious! Too bad all I have is a toaster oven. But once I upgrade to a grown-up oven, Im definitely making this!
- December 9, 2009 at 8:48 AM
- Miriam Kato said...
I made this bread today and it's simply delicious! And easy! If you don't mind I will create a post in my blog and point to your blog.
Delicious!!!!!! Thanks Beatrice!!!!
- December 14, 2009 at 7:35 PM
- Beatrice said...
Of course -- I'm glad you liked it!
- December 15, 2009 at 5:35 AM


text:
|Thread Tools
|Display Modes
As for the folks that wait around in hotel lobbies and stalk players to get 10 of the exact same picture signed, they should all be deported.
Last edited by Standing Ovation; 01-29-2014 at 01:20 PM.
Consider that some of us are collectors of White Sox memorabilia. Not all are out to make a buck. We are particular about the quality of our items and achievements of the players that make-up our collections. I don't have a problem with a player declining to inscribe anything due to the secondary market, that comes with this hobby we have chose. It's a whole other issue when the player (when asked politely) to sign an item in a spot on a special item for your collection. I think REAL collectors get a bum rap from players and others who don't understand the thought and effort put on those items we cherish.
IMO I think it takes away from the "fan fest" when simple request is answered with a sarcastic response or a disrespectful retort. I have signed baseballs and other items from Mark Kotsay and Scott Linebrink (the baseball is actually worth more without the signatures) right next to my Frank Thomas and Luke Appling and display them ALL with pride.
This was my 21st SoxFest and I actually got more autographs at this one (seven) than at the last couple combined. I opted to take a pass on autographs on Friday, since Frank Thomas was only taking photos and having a seminar with Hawk & Wimpy that night, both of which were musts for me when the crowds would likely be significantly lower on Friday than in recent years (they were).
As usual, the red-shirted guest service employees knew nothing about wristbands. When we were let in to SoxFest, my friends and I went to the Grand Ballroom to snag seats for the Opening Ceremony, and my good friend tstrike2000 and I went downstairs to get wristbands for the picture with Frank, which was at 5:30. Of course, no wristbands were being given at 3:45 when we went down there and the woman at the line has no idea when they'd be handed out. She saw the frustration on my face from the lack of wristbands and an answer as to when they'd be distributed, so the girl asked if it was just tstrike2000 & I trying to get a picture and where we wanted to be in the meantime. I told her we had seats at the Opening Ceremony and she said that if the line reached capacity by the time we returned, she'd let us in. After being back upstairs for awhile, we'd heard that wristbands were being given for the photo with Frank, so we went down to get our wristbands and made it back just in time for the Opening Ceremony to start (a half hour late).
After the Opening Ceremony, I stayed in the ballroom for the Rick Hahn/Robin Ventura seminar, which was rather subdued, then we went downstairs for the picture with Frank. Afterwards, we attended his seminar that was led by Hawk & Wimpy, which was awesome.
One thing I did notice about the seminars was that they weren't lasting the full hour they were scheduled for. The Hahn/Ventura seminar was scheduled from 5-6p and it ended around 5:40, and the "Frankly Speaking" seminar was supposed to be from 7-8p, but ended at 7:30. I didn't attend any of the Saturday seminars, so can't say whether or not that was unique to Friday's sessions or not.
After a late, but great dinner at Pizano's with tebman, son of tebman, and my friend Natalie, it was time for a quick nap before Saturday's festivities began. By 6:00 the next morning, we were all down in the Empire Room and about 2/3 of the way back to boot! I decided that this would be my day for autographs and the only must-have for me was Robin. I hung out with tstrike2000 all day and we got the same autographs -- Avisail Garcia and Dayan Viciedo; Robin and Adam Dunn; Gordon Beckham; and Marcus Semien and Micah Johnson.
Particularly disappointing at the Semien/Johnson signing was the SoxFest nazi seated at their table. From left to right, it was the SoxFest nazi, Semien and Johnson. The guy in front of me was getting Semien's autograph and I was next in line. While I was waiting (with baseball and camera in hand), I decided to take a couple pictures. The SoxFest nazi immediately scolded me, saying, "No pictures! We have to keep the line moving!" I told her, "I'm not holding up the line by standing here taking a picture. It's this man's turn to get an autograph and I'm next in line. Once it's my turn, I'll move up and get my autograph. And don't worry, I won't stop to take a picture." All she could do was shoot me a dirty look. I wanted to be like, "Look, lady, I've been coming to this event for 21 years and remember when fans used to be able to walk around the table, stand behind the player, and have their picture taken. Don't tell me that I can't take a picture while standing on this platform and waiting for my turn." And really, let's be honest; Semien and Johnson aren't exactly Thomas and Ventura. I made sure to tell this story in the SoxFest survey I was sent Sunday night.
Also in the SoxFest survey, I went off about the red-shirted guest representatives never having an answer about when wristbands will be given out, etc. Not too many years ago, wristbands would be handed out immediately after the fest opened or lines started forming for a particularly popular player. I'm not sure why the Sox have gone away from that, especially since it seemed to work so well, but it's increasingly frustrating to constantly deal with people at SoxFest who don't have any answers. I've been going to SoxFest longer than many of those guest reps. have been on this earth and resent the way they treat me and other Sox fans like third-class citizens. All of this was detailed in the survey I took.
Unfortunately, I had to leave SoxFest by 9:00 on Sunday morning, so I didn't get to do anything that day.
I think it's interesting that SoxFest is moving venues next year. However, I'm in favor of this because the Palmer House never seemed like "home" for a baseball nerd convention; it's too fancy schmancy. Not to mention the fact that the fest is spread out over three floors; it's escalators, elevators and hidden stairwells abound at SoxFest. From what I've heard, the Hilton on Michigan Ave. is more like the Hyatt in that everything has the potential to be on one or two floors, which will be much easier to navigate. I'm curious to see if the pricing will remain the same for the new venue, as well. They can't possibly hike up the prices any more, can they?!
Overall, though, it was a great SoxFest. How could any event that provides its fans with an opportunity to get your picture taken with a Hall of Famer really be bad? Speaking of that, I had a print made of the picture of me & Frank and it's prominently displayed in a frame in my living room. In one frame on my bookshelf, I have a picture of me & Robin, and a picture of me & Frank in another. I grew up watching Frank and Robin, so it's pretty special for me to have had a picture taken with each of them and have those on display for everyone to see.
The 2005 World Champion White Sox: Thanks for a lifetime of memories!
2019 Record:3-5 Next Game: August 11 vs. Oakland
I ♥ Pods; I ♥ SUMMER!!!!
Yaz! Pliers!
"Robin Ventura has one thing Ozzie does not have -- CLASS!" ~My dad, in response to seeing the Sox commercials that featured Robin, 03.08.12
Speaking of employees at the park, does anybody have any idea how I would go about applying for a job there? I am a teacher so I have the summer off and thought it would be a nice change of pace to work at the ballpark. My dream job would be working as a member of the grounds crew, but I think those are more long term positions that I would not be able to do.
In keeping with the topic, great review as always. Although I am nowhere near 20+ consecutive years at Soxfest, I have attended the last several and I agree with many of the points made by ChiSoxGirl. I have had many positive interactions with some of the White Sox employees at Soxfest, but I am continuously baffled at the fact that so many of them are uninformed about what is going on.
I think the job of Soxfest is to connect with fans and get them excited about the upcoming season. I am encouraged by the moves that Hahn has made this offseason and after sitting in on seminars and listening to Abreu and Eaton speak I am definitely looking forward to Opening Day. I also heard a small portion of Avisail Garcia's interview with The Score while I was waiting in line and he is another guy that I am anxious to see in a White Sox uniform for the entire season.
My thoughts are bouncing around in my head right now so I am shifting gears once more. Has anyone on here ever found out the protocol for White Sox players attending Soxfest? Basically I am asking how they determine who will and will not show up. I understand if a player has a wedding, family emergency, etc. but I'm sure most of you have recognized the fact that some players just never attend. (ie. Alex Rios) Not sure if Rios's situation would have to do with his VISA or something...just wondering.
Unlikely. Rios was born in Alabama and, as such, is a U.S. citizen. He shouldn't need a Visa.
My Sox Summer / 50 games for under $500 / @mysoxsummer / #mysoxsummer
Follow my progress at http://mysoxsummer.wordpress.com/ http://www.facebook.com/MySoxSummer
Or you could always apply to be the Cubs mascot.
|Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
|Thread Tools
|Display Modes
Linear Mode


text:
Self lawyering made easier by new rule, Connecticut attorneys say
Program aims to speed family law cases
STAMFORD -- With the state's family law courts getting increasingly bogged down with rising numbers of people representing themselves, the judicial system has started a new program that allows people to hire lawyers for specific parts of their cases.
"It impacts everybody when somebody is not being represented by a lawyer," said Steve Eppler-Epstein, who sits on the Access to Justice Commission that started the program. "Everyone has to explain every step along the way. It slows down the case for the person, and on the other side it is slow going for the court personnel and the judge. When the court system slows down, that makes the judicial system more expensive for everybody," he said.
The number of people representing themselves in family cases has been growing for years, mainly because of the downturn in the economy. Now, more than three-quarters of all family cases have at least one self-represented party involved, state figures show.
The pilot program, called Limited Scope Representation, was launched in January to make it easier and quicker for those acting as their own lawyers to navigate the family court docket, where issues of divorce, separation, annulment, custody, child visitation, paternity and child support are decided. It has been used in 56 cases around the state since it was launched Jan. 6, state Judicial Branch spokeswoman Rhonda Stearley-Hebert said.
Westport lawyer Christine O'Sullivan recently was hired to handle a custody issue for a father who is representing himself in a divorce. He needed help with a hearing involving his child attending a school in a different town.
"Normally, if you are talking to a lawyer about a custody issue or divorce, you are talking about spending thousands and thousands and thousands of dollars," O'Sullivan said. She said custody cases can drag on for years. Lawyers who handle custody cases typically charge a minimum of $300 an hour, and often much more.
O'Sullivan was able to resolve the problem with a few court appearances and multiple office visits, and charged her client less than $2,000.
The right to represent oneself in court has been around since the beginning days of the nation, but it has unintended consequences.
Judges may have difficulty being fair to both sides when one is being represented by a lawyer and the other is not. People without legal training may file papers improperly or not understand how to conduct themselves in the courtroom to the letter of the law.
Judge William Bright Jr., the sitting administrative judge in the Tolland Judicial District, said, "Obviously we want to decide the cases on the merits, but it is sometimes hard to get to the merits if the person doesn't understand the legal procedure -- say, the rules of evidence -- the things they need to know to get the substantive issues in front of us," Bright said. "We can't provide legal advice to pro se plaintiffs or defendants. Sometimes a person gets stuck where they don't know what to do, and it gums up the works."
Bright sits on the Access to Justice Commission that proposed the Limited Scope Representation program to the Judicial Branch, and said the commission began looking at the issue two or three years ago. There are about 40 states that now allow similar practices. In those states it not only helped alleviate some of the pro se issues in the courts, but it promoted more pro bono, or free, work in some areas because attorneys knew they would not have to stick it out for the entire life of the case, Bright said.
Connecticut's NAME program had a good start, with lawyers filing limited representation appearances in 56 cases in its first six weeks, Bright said.
That's a drop in the bucket though. In Connecticut, during the 2012-13 fiscal year, 77 percent, or 28,010, of all family cases filed in the state had at least one self-represented party involved either as the plaintiff or defendant. During that same time, 36 percent of all the family cases filed around the state, or 11,714 cases, had both a self-represented plaintiff and self-represented defendant, statistics from the state's Judicial Branch show.
Eppler-Epstein, who is also the executive director of Connecticut Legal Services, the state's nonprofit law firm that provides free representation to low-income people, said he and his attorneys are evaluating the program to see if any of their current or prospective clients could represent themselves and have their lawyers jump in for the hard parts.
"That should make lawyers more affordable for low-income people and people of moderate means," he said.
But because most his firm's cases involve domestic violence, his lawyers we will continue to do the complete scope of those cases.
Jill Plancher, a full-time volunteer lawyer in the Stamford office of Connecticut Legal Services, said the program could free up their attorneys' time to help more people. Most lawyers are a little "gun shy," but the attorneys in her office have been talking about it and are thinking about using it because there aren't enough attorneys on staff in her office to represent all the people who need their services, she said.
One concern lawyers might have, she said, would be whether they would be well enough informed about the details of a case if they just handled one piece of it, instead of being involved from the beginning.
"The jury is still out on whether it will work," Plancher said. "I don't know if it will be effective. I hope so, but I don't know. The complication is, as an attorney you would need to make sure that you are as informed as you need to be to do a good job."
Bright said the program could expand, if things keep going the way they are.
"Our hope is it will go well in family court and within a couple of years we will be talking about it in (other) civil cases as well," he said.


text:
Email Address:
© 2017 Cognizant TriZetto Software Group, Inc. All rights reserved.
TriZetto provides leading healthcare IT solutions for payers and providers. TriZetto promotes integrated care management by offering comprehensive solutions for care management software, claims management services, network management solutions and more. With solutions for care management, patient-centered medical home (PCMH) solutions, payment bundling and other innovative models, TriZetto is helping reduce the cost, improve the quality of care and transform the healthcare industry.


text:
0 Items (Empty)
Recently Viewed Items
Your Shopping Cart
Your shopping cart is currently empty. If you would like to make a purchase today, add items to your shopping cart.
This is a check seat for the Wilkins 975DA series reduced pressure detector assemblies. This will fit either the first or second check. Does not include seat O-Ring. Seat O-Ring listed below. Genuine Zurn/Wilkins repair parts. No special tools are required for servicing.
Not Lead Free Compliantp>


text:
Table of contents
Urban Rivals Cheats :
Code - Urban Rival Newbie Guide
This is A Guide Not a cheat....There is no Cheat!!!!!!
Start with the basics:
Use the pills wisely....
Understand the ability of your cards wisely
How Do I get leaders characters
2 ways
THis is for today have not much time to do the Rest
IF you need more help contact"_espada_" or" "LaggerJack"
Code - Free credits
by Unregistered Jul 04, 2011
put your sponsor Darkrixd and you get 5 times credits you buy and a bonus 5000 clintz when starting also a kolos! try it out does work :D.
Code - 100% Working Hack (Has nothing to do with entering a name)
by Unregistered Sep 26, 2011
So what you have to do is realize that the game utilizes an external server and as such in order to truly hack the game you would need to access it via some hacking suite. Entering a name really does nothing but give that person 10% of the credits you purchase. If you don't mind that someone is getting free stuff after lying to you (because entering names in the sponsor box will do nothing to your own account despite what these scummy wastes of human life would want you to think) then feel free to do so. As of now, there is no true hack for Urban-Rivals short of accessing their server. The easiest way to try to hack the game for free credits involves intercepting the Allopass codes and trying to inject your own packets to dupe the system into thinking that there has been a code paid for and created. However, this too is extremely hard as Allopass is made to make money and will, without a doubt, have a solid security system in order to make sure their company stays afloat.
I'm sorry to break you heart about trying to hack the game, but it's simply impossible right now. If people add comments saying they have a way to hack this game then they are lying to your face. The best way to do well in this game is just keep playing it.
Secret - Duplication de code allopass / Duplicate you code allopass
continue →
Code - Free Clintz + Credits working as of August 06, 2010
Note: Do not type in anyone else's name as a sponsor when you create a new account. This is a mere scam. As long as they're your sponsor and when you buy credits/clintz with actual money, they get some profit off of you. Who does this exactly? Everyone who tells you to...
Code - The actual truth
by Unregistered Aug 16, 2011
Okay I'm an admin for urban rivals and I've noticed people trying to cheat others. The truth is that adding a sponsor is for the directors of Urban Rivals to find the most active users and give them bonuses. Only by entering an admins name into both the sponsor and promotional code boxes will you get any sort of a bonus. Mine is "dinorama" (no quotes.) If you do put this in both boxes then you still must buy credits to see any results, lest the site go broke and shutdown. Buy 1000 credits and you can get 4000 extra with the purchase.
Note: do not try saying its a lie when you don't even try it because you don't feel like spending the money. Only do this if you are willing to spend $45. This will allow you to get over 100 cards and make the account invincible.
Code - Cheat urban rivals double credits(working)
by Unregistered Sep 03, 2014
Hello!I have searched on the internet cheats for urban rivals,and I found one that its really working(It´s a blog of a hacker that uses something to double the credits).This is what you must do:
1.Create a account ,WITH A FAKE EMAIL, then put this in ID:tiagoworgen ,and on the promotional code put what you want(Put one if you really know what It does).
2.Play at level 5 and when you receive Timber,go to Shop and buy 40 credits or more if you want.
3.Then send a message to him saying your FAKE EMAIL and he will duplicate the credits.
PS:If you want to duplicate more, buy again and use the code that the urban rivals gives you at buying credits and you will receive more 100%(of the duplicate)+(...)(the value of your code).If you want to contact him talk italian(Im spanish i don't know very much English) using the google Translation.
Enjoy your double credits :D .
Code - Get Taylor and Castro from the Berzerks every time.
I found out that if you put karnage66 as your sponsor when you buy either the Titanium pack, the full deck pack or the new blood pack then you nearly always get Castro or Taylor, sometimes both !
These are serious good cards, not only that Taylor sells for 20'000 clints on the market and Castro sells for 70'000 clints. So far I've received one of these every time I've put in this code, and when I put it in for the titanium pack I got both! Make sure you pick the Berzerks as one of your clans though or it crashes the app/window.
Have fun with your awesome cards.
Code - This is the deal do it now cos promo code dont last for long
by Unregistered Oct 17, 2011
this is from the Walmart company they paid urban-rivals to get some kind of publicity trough sponsor and promo code SO here is the information ... PS: U DONT HAVE TO TRUST ME, IF U DONT JUST DONT READ THIS!
Sponsor ID: WalmartSponsor
Promo Code : WalmartLover
Gives: 50 credits!!! (Full Deck Booster)
250 Clintz!!!
Start with 16 cards instead of 8!!!
SO what are u waiting for :D!! try it
Code - Urban rival cheat
by Unregistered Aug 31, 2011
For all Aussies out there this is a cheat that only works in Australia. put sponsor name: Vegemite AU and you get 100 credits after reaching level five.
Code - 50% credit bonus
by Unregistered Jul 25, 2011
Create a new account. Enter Fangsman as your sponsor ID, and bloodnew
Code - This really works for all places and devices.
by Unregistered Nov 21, 2011
Urban Rivals IS heavy with cheats.Type all the codes in the search box.
Code - 20% more credits at Urban rivals
by Unregistered Sep 12, 2011
I use this yesterday and works. Only works with new accounts. When you create a new account, put in Sponsor nickname or ID Xalaus and the code M52XRC21, it's a promotion of Sponsorpay. At the first month you earn 20% more credits when you buy credits at credit's shop.
Code - 1 code,all other code are fake
i got this code from this site from 1newway00
i tryed them all but the only one that works was:
ID:ironlogic and the Promotioncode:745110
when i bought a 'full deck' in the store (not to expensive)
Urban Rivals Cheats:


text:
Hi there... I was wondering if someone could point me to some rather "elementary" websites, (or just let me know in the Forum... but keep it simple) that would explain the scientific methods of dating geological and archaeological remains? I come from a background in both creationism and evolution/science, and am looking into these things... I am looking more for the scientific side at this point.
So, how do they do it?
Any help would be appreciated. This is a great site.
Thanks all!


text:
Mark Twain Elementary PTO enhances student education and builds community through volunteer and fundraising efforts.
« Parent University and IB Night
Spring Book Fair »
Print this page
by daniellelincoln
Permanent link to this article: http://marktwainpto.org/event/spring-book-fair/
There are no upcoming events.
Except where otherwise noted, content on this site is licensed under a Creative Commons Licence.
Foundation WordPress using the Graphene Theme built with Digital PTO.


text:
Stop stressing and let us help you with those pesky New Year's resolutions. From fashion to food, USA TODAY has some lifestyle advice to make 2013 one of your best years yet.
Resolve to: spice up your wardrobe
You don't have to have a body like Beyonc�'s to show off what you've got in 2013. Instead of relying on boring trousers or the same old pencil skirt for the office next year, opt for a graphic colorblocked dress or a tailored floral frock that are both flattering and work-ready.
Resolve to: communicate in style
That awkward moment when you had broccoli in your teeth during the entire. first. date. Steer clear of that and other embarrassing moments next year with an iPhone case that doubles as a miniature vanity. Pop up the case's 4-inch-long hidden mirror and reapply your lipstick or smooth flyaways to your heart's content.
Resolve to: sweat like an Olympian
Ballet-inspired barre classes are the latest "it" exercise, and now there's a new shoe dedicated to the fitness fad. Be sure to pick up a pair of Nike's Studio Wraps, which allow aspiring ballerinas, yogis and Pilates junkies alike to get a firm grip on their routine in the new year with the footwear, which will be available for purchase in spring 2013.
Resolve to: celebrate like a rock star
Champagne is a natural companion to New Year's Eve celebrations, but what about the other 364 days of the year? Cue the tequila! Pick up a bottle of Don Julio's smooth, caramel-and-toffee-tinged 1942 tequila, favored by celebs such as Matthew McConaughey, Eva Longoria and Michael Phelps.
Resolve to: cook and eat like a celeb chef
Bobby Flay knows a thing or two about making magic in the kitchen, but even the best of us need a little improving. So, the celeb chef plans to get into gear in 2013 in his upcoming digital series Bobby Flay Fit, which premieres Jan. 14 on FoodNetwork.com/fit. The seven-episode series will find Flay, among other things, breaking a sweat at a SoulCycle class and trying out new recipes for eating light.
Resolve to dress, feel, eat better in 2013
Stop stressing and let us help you with those pesky New Year's resolutions. From fashion to food, USA TODAY has some lifestyle advice to make 2013 one of your best years yet.


text:
m (Fixed spelling)
m (Fixed spelling)
|Line 1,031:
|Line 1,031:
set( kwhatevertest_SRCS
set( kwhatevertest_SRCS .cpp )
kde4_add_unit_test( kwhatevertest
kde4_add_unit_test( kwhatevertest
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
Author: Brad Hards, Sigma Bravo Pty Limited
This article provides guidance on writing unittests for Qt4 and KDE4, based on the QtTestLib framework provided starting with Qt4.1. It provides an introduction to the ideas behind unit testing, tutorial material on the QtTestLib framework, and suggestions for getting the most value for your effort. This document is matched to Qt 4.1 and KDE 4.
A unit test is a test that checks the functionality, behaviour and correctness of a single software component. In Qt4 code (including KDE4 code) unit tests are almost always used to test a single C++ class (although testing a macro or C function is also possible).
Unit tests are a key part of Test Driven Development, however they are useful for all software development processes. It is not essential that all of the code is covered by unit tests (although that is obviously very desirable!). Even a single test is a useful step to improving code quality.
Note that unit tests are dynamic tests (i.e. they run, using the compiled code) rather than static analysis tests (which operate on the source or some intermediate representation).
Even if they don't call them "unit tests", most programmers have written some "throwaway" code that they use to check an implementation. If that code was cleaned up a little, and built into the development system, then it could be used over and over to check that the implementation is still OK. To make that work a little easier, we can use test frameworks.
Note that it is sometimes tempting to treat the unit test as a pure verification tool. While it is true that unit tests do help to ensure correct functionality and behaviour, they also assist with other aspects of code quality. Writing a unit test requires a slightly different approach to coding up a class, and thinking about what inputs need to be tested can help to identify logic flaws in the code (even before the tests get run). In addition, the need to make the code testable is a very useful driver to ensure that classes do not suffer from close coupling.
Anyway, enough of the conceptual stuff - lets talk about a specific tool that can reduce some of the effort and let us get on with the job.
QtTestlib is a lightweight testing library developed by Trolltech and released under the GPL (a commercial version is also available, for those who need alternative licensing). It is written in C++, and is cross-platform. It is provided as part of the tools included in Qt 4.1, and earlier versions were provided separately. Note that earlier versions had a different API, and the examples will not work with that earlier version.
In addition to normal unit testing capabilities, QtTestLib also offers basic GUI testing, based on sending QEvents. This allows you to test GUI widgets, but is not generally suitable for testing full applications.
Each testcase is a standalone test application. Unlike CppUnit or JUnit, there is no Runner type class. Instead, each testcase is an executable which is simply run.
In this tutorial, we will build a simple test for a class that represents a date, using QtTestLib as the test framework. To avoid too much detail on how the date class works, we'll just use the QDate. class that comes with Qt. In a normal unittest, you would more likely be testing code that you've written yourself.
The code below is the entire testcase.
Example 1. QDate test code
class testDate: public QObject {
private slots:
void testValidity(); void testMonth();
void testDate::testValidity() {
// 11 March 1967 QDate date( 1967, 3, 11 ); QVERIFY( date.isValid() );
void testDate::testMonth() {
// 11 March 1967 QDate date; date.setYMD( 1967, 3, 11 ); QCOMPARE( date.month(), 3 ); QCOMPARE( QDate::longMonthName(date.month()), QString("March") );
Save as tutorial1.cpp
Stepping through the code, the first line imports the header files for the QtTest namespace. The second line imports the headers for the QtCore namespace (not strictly necessary, since QtTest also imports it, but it is robust and safe). Lines 4 to 10 give us the test class, testData. Note that testDate inherits from QObject and has the Q_OBJECT macro - QtTestLib requires specific Qt functionality that is present in QObject.
Lines 12 to 17 provide our first test, which checks that a date is valid. Note the use of the QVERIFY macro, which checks that the condition is true. So if date.isValid() returns true, then the test will pass, otherwise the test will fail. QVERIFY is similar to ASSERT in other test suites.
Similarly, lines 19 to 27 provide another test, which checks a setter, and a couple of accessor routines. In this case, we are using QCOMPARE, which checks that the conditions are equal. So if date.month() returns 3, then that part of that test will pass, otherwise the test will fail.
|As soon as a QVERIFY evaluates to false or a QCOMPARE does not have two equal values, the whole test is marked as failed and the next test will be started. So in the example above, if the check at line 24 fails, then the check at lines 25 and 26 will not be run.
In a later tutorial we will see how to work around problems that this behaviour can cause.
Line 30 uses the QTEST_MAIN which creates an entry point routine for us, with appropriate calls to invoke the testDate unit test class.
Line 31 includes the Meta-Object compiler output, so we can make use of our QObject functionality.
The qmake project file that corresponds to that code is shown below. You would then use qmake to turn this into a Makefile and then compile it with make.
Example 2. QDate unit test project
CONFIG += qtestlib
TEMPLATE = app
SOURCES += tutorial1.cpp Save as tutorial1.pro
This is a fairly normal project file, except for the addition of the
CONFIG += qtestlib. This adds the right header and library setup to the Makefile.
Create an empty file called tutorial1.h and compile with
qmake; make The output looks like the following:
Example 3. QDate unit test output
$ ./tutorial1
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051003 PASS : testDate::initTestCase() PASS : testDate::testValidity() PASS : testDate::testMonth() PASS : testDate::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped
Looking at the output above, you can see that the output includes the version of the test library and Qt itself, and then the status of each test that is run. In addition to the testValidity and testMonth tests that we defined, there is also a setup routine (initTestCase) and a teardown routine (cleanupTestCase) that can be used to do additional configuration if required.
If we had made an error in either the production code or the unit test code, then the results would show an error. An example is shown below:
Example 4. QDate unit test output showing failure
$ ./tutorial1
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051003 PASS : testDate::initTestCase() PASS : testDate::testValidity() FAIL! : testDate::testMonth() Compared values are not the same
Actual (date.month()): 4 Expected (3): 3 Loc: [tutorial1.cpp(25)]
PASS : testDate::cleanupTestCase() Totals: 3 passed, 1 failed, 0 skipped
When the number of test functions increases, and some of the functions take a long time to run, it can be useful to only run a selected function. For example, if you only want to run the testMonth function, then you just specify that on the command line, as shown below:
Example 5. QDate unit test output - selected function
$ ./tutorial1 testValidity
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051003 PASS : testDate::initTestCase() PASS : testDate::testValidity() PASS : testDate::cleanupTestCase() Totals: 3 passed, 0 failed, 0 skipped
Note that the initTestCase and cleanupTestCase routines are always run, so that any necessary setup and cleanup will still be done.
You can get a list of the available functions by passing the -functions option, as shown below:
Example 6. QDate unit test output - listing functions
$ ./tutorial1 -functions
You can get more verbose output by using the -v1, -v2 and -vs options. -v1 produces a message on entering each test function. I found this is useful when it looks like a test is hanging. This is shown below:
Example 7. QDate unit test output - verbose output
$ ./tutorial1 -v1
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051003 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testValidity() entering PASS : testDate::testValidity() INFO : testDate::testMonth() entering PASS : testDate::testMonth() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped
The -v2 option shows each QVERIFY, QCOMPARE and QTEST, as well as the message on entering each test function. I found this useful for verifying that a particular step is being run. This is shown below:
'Example 8. QDate unit test output - more verbose output
$ ./tutorial1 -v2
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051003 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testValidity() entering INFO : testDate::testValidity() QVERIFY(date.isValid())
Loc: [tutorial1.cpp(17)]
PASS : testDate::testValidity() INFO : testDate::testMonth() entering INFO : testDate::testMonth() COMPARE()
Loc: [tutorial1.cpp(25)]
INFO : testDate::testMonth() COMPARE()
Loc: [tutorial1.cpp(27)]
PASS : testDate::testMonth() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped
The -vs option shows each signal that is emitted. In our example, there are no signals, so -vs has no effect. Getting a list of signals is useful for debugging failing tests, especially GUI tests which we will see in the third tutorial.
If you want to output the results of your testing to a file, you can use the -o filename, where you replace filename with the name of the file you want to save output to.
In the previous example, we looked at how we can test a date class. If we decided that we really needed to test a lot more dates, then we'd be cutting and pasting a lot of code. If we subsequently changed the name of a function, then it has to be changed in a lot of places. As an alternative to introducing these types of maintenance problems into our tests, QtTestLib offers support for data driven testing.
The easiest way to understand data driven testing is by an example, as shown below:
Example 9. QDate test code, data driven version
class testDate: public QObject {
private slots:
void testValidity(); void testMonth_data(); void testMonth();
void testDate::testValidity() {
// 12 March 1967 QDate date( 1967, 3, 12 ); QVERIFY( date.isValid() );
void testDate::testMonth_data() {
QTest::addColumn<int>("year"); // the year we are testing QTest::addColumn<int>("month"); // the month we are testing QTest::addColumn<int>("day"); // the day we are testing QTest::addColumn<QString>("monthName"); // the name of the month
QTest::newRow("1967/3/11") << 1967 << 3 << 11 << QString("March"); QTest::newRow("1966/1/10") << 1966 << 1 << 10 << QString("January"); QTest::newRow("1999/9/19") << 1999 << 9 << 19 << QString("September"); // more rows of dates can go in here...
void testDate::testMonth() {
QFETCH(int, year); QFETCH(int, month); QFETCH(int, day); QFETCH(QString, monthName);
QDate date; date.setYMD( year, month, day); QCOMPARE( date.month(), month ); QCOMPARE( QDate::longMonthName(date.month()), monthName );
As you can see, we've introduced a new method - testMonth_data, and moved the specific test date out of testMonth. We've had to add some more code (which will be explained soon), but the result is a separation of the data we are testing, and the code we are using to test it. The names of the functions are important - you must use the _data suffix for the data setup routine, and the first part of the data setup routine must match the name of the driver routine.
It is useful to visualise the data as being a table, where the columns are the various data values required for a single run through the driver, and the rows are different runs. In our example, there are four columns (three integers, one for each part of the date; and one QString ), added in lines 19 through 22. The addColumn template obviously requires the type of variable to be added, and also requires a variable name argument. We then add as many rows as required using the newRow function, as shown in lines 23 through 26. The string argument to newRow is a label, which is handy for determining what is going on with failing tests, but doesn't have any effect on the test itself.
To use the data, we simply use QFETCH to obtain the appropriate data from each row. The arguments to QFETCH are the type of the variable to fetch, and the name of the column (which is also the local name of the variable it gets fetched into). You can then use this data in a QCOMPARE or QVERIFY check. The code is run for each row, which you can see below:
Example 10. Results of data driven testing, showing QFETCH
$ ./tutorial2 -v2
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051020 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testValidity() entering INFO : testDate::testValidity() QVERIFY(date.isValid())
Loc: [tutorial2.cpp(19)]
PASS : testDate::testValidity() INFO : testDate::testMonth() entering INFO : testDate::testMonth(1967/3/11) COMPARE()
Loc: [tutorial2.cpp(44)]
INFO : testDate::testMonth(1967/3/11) COMPARE()
Loc: [tutorial2.cpp(45)]
INFO : testDate::testMonth(1966/1/10) COMPARE()
Loc: [tutorial2.cpp(44)]
INFO : testDate::testMonth(1966/1/10) COMPARE()
Loc: [tutorial2.cpp(45)]
INFO : testDate::testMonth(1999/9/19) COMPARE()
Loc: [tutorial2.cpp(44)]
INFO : testDate::testMonth(1999/9/19) COMPARE()
Loc: [tutorial2.cpp(45)]
PASS : testDate::testMonth() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped
As an alternative to using QFETCH and QCOMPARE, you may be able to use the QTEST macro instead. QTEST takes two arguments, and if one is a string, it looks up that string as an argument in the current row. You can see how this can be used below, which is equivalent to the testMonth() code in the previous example.
Example 11. QDate test code, data driven version using QTEST
void testDate::testMonth()
QFETCH(int, year); QFETCH(int, month); QFETCH(int, day);
QDate date; date.setYMD( year, month, day); QCOMPARE( date.month(), month ); QTEST( QDate::longMonthName(date.month()), "monthName" );
In the example above, note that monthName is enclosed in quotes, and we no longer have a QFETCH call for monthName.
The other QCOMPARE could also have been converted to use QTEST, however this would be less efficient, because we already needed to use QFETCH to get month for the setYMD in the line above.
./tutorial2 -v2 testMonth:1967/3/11. The result of this is shown below.
Example 12. QDate unit test output - selected function and data
$ ./tutorial2 -v2 testMonth:1967/3/11
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051020 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testMonth() entering INFO : testDate::testMonth(1967/3/11) COMPARE()
Loc: [tutorial2.cpp(44)]
INFO : testDate::testMonth(1967/3/11) COMPARE()
Loc: [tutorial2.cpp(45)]
PASS : testDate::testMonth() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 3 passed, 0 failed, 0 skipped
In the previous two tutorials, we've tested a date management class. This is an pretty typical use of unit testing. However Qt and KDE applications will make use graphical classes that take user input (typically from a keyboard and mouse). QtTestLib offers support for testing these classes, which we'll see in this tutorial.
Again, we'll use an existing class as our test environment, and again it will be date related - the standard Qt QDateEdit class. For those not familiar with this class, it is a simple date entry widget (although with some powerful back end capabilities). A picture of the widget is shown below.
The way QtTestLib provides GUI testing is by injecting QInputEvent events. To the application, these input events appear the same as normal key press/release and mouse clicks/drags. However the mouse and keyboard are unaffected, so that you can continue to use the machine normally while tests are being run.
An example of how you can use the GUI functionality of QtTestLib is shown below.
Example 13. QDateEdit test code
class testDateEdit: public QObject {
private slots:
void testChanges(); void testValidator_data(); void testValidator();
void testDateEdit::testChanges() {
// 11 March 1967 QDate date( 1967, 3, 11 ); QDateEdit dateEdit( date );
// up-arrow should increase day by one QTest::keyClick( &dateEdit, Qt::Key_Up ); QCOMPARE( dateEdit.date(), date.addDays(1) );
// we click twice on the "reduce" arrow at the bottom RH corner // first we need the widget size to know where to click QSize editWidgetSize = dateEdit.size(); QPoint clickPoint(editWidgetSize.rwidth()-2, editWidgetSize.rheight()-2); // issue two clicks QTest::mouseClick( &dateEdit, Qt::LeftButton, 0, clickPoint); QTest::mouseClick( &dateEdit, Qt::LeftButton, 0, clickPoint); // and we should have decreased day by two (one less than original) QCOMPARE( dateEdit.date(), date.addDays(-1) );
QTest::keyClicks( &dateEdit, "25122005" ); QCOMPARE( dateEdit.date(), QDate( 2005, 12, 25 ) );
QTest::keyClick( &dateEdit, Qt::Key_Tab, Qt::ShiftModifier ); QTest::keyClicks( &dateEdit, "08" ); QCOMPARE( dateEdit.date(), QDate( 2005, 8, 25 ) );
void testDateEdit::testValidator_data() {
QTest::addColumn<QDate>( "initialDate" ); QTest::addColumn<QString>( "keyclicks" ); QTest::addColumn<QDate>( "finalDate" );
QTest::newRow( "1968/4/12" ) << QDate( 1967, 3, 11 ) << QString( "12041968" ) << QDate( 1968, 4, 12 );
QTest::newRow( "1967/3/14" ) << QDate( 1967, 3, 11 ) << QString( "140abcdef[" ) << QDate( 1967, 3, 14 ); // more rows can go in here
void testDateEdit::testValidator() {
QFETCH( QDate, initialDate ); QFETCH( QString, keyclicks ); QFETCH( QDate, finalDate );
QDateEdit dateEdit( initialDate ); // this next line is just to start editing QTest::keyClick( &dateEdit, Qt::Key_Enter ); QTest::keyClicks( &dateEdit, keyclicks ); QCOMPARE( dateEdit.date(), finalDate );
Much of this code is common with previous examples, so I'll focus on the new elements and the more important changes as we work through the code line-by-line.
Lines 1 to 3 import the various Qt declarations, as before.
Line 4 is a macro that is required for the data-driven part of this test, which I'll come to soon.
Lines 5 to 12 declare the test class - while the names have changed, it is pretty similar to the previous example. Note the testValidator and testValidator_data functions - we will be using data driven testing again in this example.
Our first real test starts in line 13. Line 16 creates a QDate, and line 17 uses that date as the initial value for a QDateEdit widget.
Lines 19 and 20 show how we can test what happens when we press the up-arrow key. The QTest::keyClick function takes a pointer to a widget, and a symbolic key name (a char or a Qt::Key). At line 20, we check that the effect of that event was to increment the date by a day. The QTest:keyClick function also takes an optional keyboard modifier (such as Qt::ShiftModifier for the shift key) and an optional delay value (in milliseconds). As an alternative to using QTest::keyClick, you can use QTest::keyPress and QTest::keyRelease to construct more complex keyboard sequences.
Lines 23 to 29 show a similar test to the previous one, but in this case we are simulating a mouse click. We need to click in the lower right hand part of the widget (to hit the decrement arrow - see Figure 1), and that requires knowing how large the widget is. So lines 23 and 24 calculate the correct point based off the size of the widget. Line 26 (and the identical line 27) simulates clicking with the left-hand mouse button at the calculated point. The arguments to Qt::mouseClick are:
In addition to QTest::mouseClick, there is also QTest::mousePress, QTest::mouseRelease, QTest::mouseDClick (providing double-click) and QTest::mouseMove. The first three are used in the same way as QTest::mouseClick. The last takes a point to move the mouse to. You can use these functions in combination to simulate dragging with the mouse.
Lines 30 and 31 show another approach to keyboard entry, using the QTest::keyClicks. Where QTest::keyClick sends a single key press, QTest::keyClicks takes a QString (or something equivalent, in line 30 a character array) that represents a sequence of key clicks to send. The other arguments are the same.
Lines 32 to 34 show how you may need to use a combination of functions. After we've entered a new date in line 30, the cursor is at the end of the widget. At line 32, we use a Shift-Tab combination to move the cursor back to the month value. Then at line 33 we enter a new month value. Of course we could have used individual calls to QTest::keyClick, however that wouldn't have been as clear, and would also have required more code.
Lines 50 to 60 show a data-driven test - in this case we are checking that the validator on QDateEdit is performing as expected. This is a case where data-driven testing can really help to ensure that things are working the way they should.
At lines 52 to 54, we fetch in an initial value, a series of key-clicks, and an expected result. These are the columns that are set up in lines 39 to 41. However note that we are now pulling in a QDate, where in previous examples we used three integers and then build the QDate from those. However QDate isn't a registered type for QMetaType, and so we need to register it before we can use it in our data-driven testing. This is done using the Q_DECLARE_METATYPE macro in line 4 and the qRegisterMetaType function in line 38.
Lines 42 to 47 add in a couple of sample rows. Lines 42 to 44 represent a case where the input is valid, and lines 45 to 47 are a case where the input is only partly valid (the day part). A real test will obviously contain far more combinations than this.
Those test rows are actually tested in lines 55 to 59. We construct the QDateEdit widget in line 55, using the initial value. We then send an Enter key click in line 57, which is required to get the widget into edit mode. At line 58 we simulate the data entry, and at line 59 we check whether the results are what was expected.
Lines 61 and 62 are the same as we've seen in previous examples.
If you are re-using a set of events a number of times, then it may be an advantage to build a list of events, and then just replay them. This can improve maintainability and clarity of a set of tests, especially for mouse movements.
The key class for building a list of test events is imaginatively known as QTestEventList. It is a QList of QTestEvents. The normal approach is to create the list, and then use various member functions to add key and mouse events. The normal functions that you'll need are addKeyClick and addMouseClick, which are very similar to the QTest::keyClick and QTest::mouseClick functions we used earlier in this tutorial. For finer grained operations, you can also use addKeyPress, addKeyRelease, addKeyEvent, addMousePress, addMouseRelease, addMouseDClick and addMouseMove to build up more complex event lists. You can also use addDelay to add a specified delay between events. When the list has been built up, you just call simulate on each widget.
You can see how this works in the example below, which is the QDateEdit example (from above) converted to use QTestEventList.
Example 14. QDateEdit test code, using QTestEventList
class testDateEdit: public QObject {
private slots:
void testChanges(); void testValidator_data(); void testValidator();
void testDateEdit::testChanges() {
// 11 March 1967 QDate date( 1967, 3, 11 ); QDateEdit dateEdit( date );
// up-arrow should increase day by one QTest::keyClick( &dateEdit, Qt::Key_Up ); QCOMPARE( dateEdit.date(), date.addDays(1) );
// we click twice on the "reduce" arrow at the bottom RH corner // first we need the widget size to know where to click QSize editWidgetSize = dateEdit.size(); QPoint clickPoint(editWidgetSize.rwidth()-2, editWidgetSize.rheight()-2); // build a list that contains two clicks QTestEventList list1; list1.addMouseClick( Qt::LeftButton, 0, clickPoint); list1.addMouseClick( Qt::LeftButton, 0, clickPoint); // call that list on the widget list1.simulate( &dateEdit ); // and we should have decreased day by two (one less than original) QCOMPARE( dateEdit.date(), date.addDays(-1) );
QTest::keyClicks( &dateEdit, "25122005" ); QCOMPARE( dateEdit.date(), QDate( 2005, 12, 25 ) );
QTestEventList list2; list2.addKeyClick( Qt::Key_Tab, Qt::ShiftModifier ); list2.addKeyClicks( "08" ); list2.simulate( &dateEdit ); QCOMPARE( dateEdit.date(), QDate( 2005, 8, 25 ) );
void testDateEdit::testValidator_data() {
QTest::addColumn<QDate>( "initialDate" ); QTest::addColumn<QTestEventList>( "events" ); QTest::addColumn<QDate>( "finalDate" );
QTestEventList eventsList1; // this next line is just to start editing eventsList1.addKeyClick( Qt::Key_Enter ); eventsList1.addKeyClicks( "12041968" );
QTest::newRow( "1968/4/12" ) << QDate( 1967, 3, 11 ) << eventsList1 << QDate( 1968, 4, 12 );
QTestEventList eventsList2; eventsList2.addKeyClick( Qt::Key_Enter ); eventsList2.addKeyClicks( "140abcdef[" );
QTest::newRow( "1967/3/14" ) << QDate( 1967, 3, 11 ) << eventsList2 << QDate( 1967, 3, 14 ); // more rows can go in here
void testDateEdit::testValidator() {
QFETCH( QDate, initialDate ); QFETCH( QTestEventList, events ); QFETCH( QDate, finalDate );
QDateEdit dateEdit( initialDate );
events.simulate( &dateEdit);
QCOMPARE( dateEdit.date(), finalDate );
This example is pretty much the same as the previous version, up to line 25. In line 26, we create a QTestEventList. We add events to the list in lines 27 and 28 - note that we don't specify the widget we are calling them on at this stage. In line 30, we simulate each event on the widget. If we had multiple widgets, we could call simulate using the same set of events.
Lines 31 to 34 are as per the previous example.
We create another list in lines 35 to 37, although this time we are using addKeyClick and addKeyClicks instead of adding mouse events. Note that an event list can contain combinations of mouse and keyboard events - it just didn't make sense in this test to have such a combination. We use the second list at line 38, and check the results in line 39.
You can also build lists of events in data driven testing as well, as shown in lines 41 to 70. The key difference is that instead of fetching a QString in each row, we are fetching a QTestEventList. This requires that we add a column of QTestEventList, rather than QString (see line 45). At lines 47 to 50, we create a list of events. At line 52 we add those events to the applicable row. We create a second list at lines 54 to 56, and add that second list to the applicable row in line 58.
We fetch the events in line 65, and use them in line 68. If we had multiple widgets, then we could use the same event list several times.
Under some conditions, it is impossible to avoid tests failing. In this section, we'll see how to deal with these cases.
Where a test doesn't make sense to run (for example, if the required test files aren't available, or the feature is architecture or operating system dependent), the cleanest solution is to skip the test.
Tests are skipped using the QSKIP macro. QSKIP takes two arguments - a label string that should be used to describe why the test is being skipped, and a enumerated constant that controls how much of the test is skipped. If you pass SkipSingle, and the test is data driven, then only the current row is skipped. If you pass SkipAll and the test is data driven, then all following rows are skipped. If the test is not data driven, then it doesn't matter which one is used.
You can see how QSKIP works in the example below:
Example 15. Unit test showing skipped tests
void testDate::testSkip_data()
QTest::addColumn<int>("val1"); QTest::addColumn<int>("val2");
QTest::newRow("1") << 1 << 1; QTest::newRow("2") << 1 << 2; QTest::newRow("3") << 3 << 3; QTest::newRow("5") << 5 << 5; QTest::newRow("4") << 4 << 5;
void testDate::testSkip() {
QFETCH(int, val1); QFETCH(int, val2);
if ( val2 == 2 ) QSKIP("Two isn't good, not doing it", SkipSingle); if ( val1 == 5 ) QSKIP("Five! I've had enough, bailing here", SkipAll); QCOMPARE( val1, val2 );
Example 16. Output of unit test showing skipped tests
$ ./tutorial4 testSkip -v2
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051107 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testSkip() entering INFO : testDate::testSkip(1) COMPARE()
Loc: [tutorial4.cpp(82)]
SKIP : testDate::testSkip(2) Two isn't good, not doing it
Loc: [tutorial4.cpp(79)]
INFO : testDate::testSkip(3) COMPARE()
Loc: [tutorial4.cpp(82)]
SKIP : testDate::testSkip(5) Five! I've had enough, bailing here
Loc: [tutorial4.cpp(81)]
PASS : testDate::testSkip() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 3 passed, 0 failed, 2 skipped
from the verbose output, you can see that the test was run on the first and third rows. The second row wasn't run because of the QSKIP call with a SkipSingle argument. Similarly, the fourth and fifth rows weren't run because the fourth row triggered a QSKIP call with a SkipAll argument.
Also note that the test didn't fail, even though there were two calls to QSKIP. Conceptually, a skipped test is a test that didn't make sense to run for test validity reasons, rather than a test that is valid but will fail because of bugs or lack of features in the code being tested.
If you have valid tests, but the code that you are testing doesn't pass them, then ideally you fix the code you are testing. However sometimes that isn't possible in the time that you have available, or because of a need to avoid binary incompatible changes. In this case, it is undesirable to delete or modify the unit tests - it is better to flag the test as "expected to fail", using the QEXPECT_FAIL macro. An example of this is shown below:
Example 17. Unit test showing expected failures
void testDate::testExpectedFail()
QEXPECT_FAIL("", "1 is not 2, even for very large 1", Continue); QCOMPARE( 1, 2 ); QCOMPARE( 2, 2 );
QEXPECT_FAIL("", "1 is not 2, even for very small 2", Abort); QCOMPARE( 1, 2 ); // The next line will not be run, because we Abort on previous failure QCOMPARE( 3, 3 );
Example 18. Output of unit test showing expected failures
$ ./tutorial4/tutorial4 testExpectedFail -v2
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051107 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testExpectedFail() entering INFO : testDate::testExpectedFail() Compared values are not the same
Actual (1): 1 Expected (2): 2 Loc: [tutorial4.cpp(41)]
XFAIL : testDate::testExpectedFail() 1 is not 2, even for very large 1
Loc: [tutorial4.cpp(41)]
INFO : testDate::testExpectedFail() COMPARE()
Loc: [tutorial4.cpp(42)]
INFO : testDate::testExpectedFail() Compared values are not the same
Actual (1): 1 Expected (2): 2 Loc: [tutorial4.cpp(45)]
XFAIL : testDate::testExpectedFail() 1 is not 2, even for very small 2
Loc: [tutorial4.cpp(45)]
PASS : testDate::testExpectedFail() INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 3 passed, 0 failed, 0 skipped
As you can see from the verbose output, we expect a failure from each time we do a QCOMPARE( 1, 2);. In the first call to QEXPECT_FAIL, we use the Continue argument, so the rest of the tests will still be run. However in the second call to QEXPECT_FAILwe use the Abort and the test bails at this point. Generally it is better to use Continue unless you have a lot of closely related tests that would each need a QEXPECT_FAIL entry.
Also note that tests that are marked as expected failures are not considered to be failures, so the test function above is considered to be a pass.
If a test that is marked to be an expected failure, and it unexpectedly passes, then that is flagged as an error, as shown below:
Example 19. Unit test showing unexpected pass
void testDate::testUnexpectedPass()
QEXPECT_FAIL("", "1 is not 2, even for very large 1", Continue); QCOMPARE( 1, 1 ); QCOMPARE( 2, 2 );
QEXPECT_FAIL("", "1 is not 2, even for very small 2", Abort); QCOMPARE( 1, 1 ); QCOMPARE( 3, 3 );
Example 20. Output of unit test showing unexpected pass
$ ./tutorial4/tutorial4 testUnexpectedPass -v2
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051107 INFO : testDate::initTestCase() entering PASS : testDate::initTestCase() INFO : testDate::testUnexpectedPass() entering INFO : testDate::testUnexpectedPass() COMPARE()
Loc: [tutorial4.cpp(53)]
XPASS : testDate::testUnexpectedPass() COMPARE()
Loc: [tutorial4.cpp(53)]
INFO : testDate::testUnexpectedPass() COMPARE()
Loc: [tutorial4.cpp(54)]
INFO : testDate::testUnexpectedPass() COMPARE()
Loc: [tutorial4.cpp(57)]
XPASS : testDate::testUnexpectedPass() COMPARE()
Loc: [tutorial4.cpp(57)]
INFO : testDate::cleanupTestCase() entering PASS : testDate::cleanupTestCase() Totals: 2 passed, 2 failed, 0 skipped
The effect of unexpected passes on the running of the test is controlled by the second argument to QEXPECT_FAIL. If the argument is Continue and the test unexpectedly passes, then the rest of the test function will be run. If the argument is Abort, then the test will stop.
If you are testing border cases, you will likely run across the case where some kind of message will be produced using the qDebug or qWarning functions. Where a test produces a debug or warning message, that message will be logged in the test output (although it will still be considered a pass unless some other check fails), as shown in the example below:
Example 21. Unit test producing warning and debug messages
void testDate::testQdebug()
qWarning("warning"); qDebug("debug"); qCritical("critical");
Example 22. Output of unit test producing warning and debug messages
$ ./tutorial4 testQdebug
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051107 PASS : testDate::initTestCase() QWARN : testDate::testQdebug() warning QDEBUG : testDate::testQdebug() debug QSYSTEM: testDate::testQdebug() critical PASS : testDate::testQdebug() PASS : testDate::cleanupTestCase() Totals: 3 passed, 0 failed, 0 skipped
Note that while this example produces the debug and warning messages within the test function (testQdebug), those messages would normally be propagated up from the code being tested. However the source of the messages does not make any difference to how they are handled.
If your test needs include either a clean output, or verification that appropriate messages are generated, then you will probably need the QtTest::ignoreMessage function.
|Note: The ignoreMessage function can be used to ignore a message, however it might be clearer to think of this function as checking for the presence of an expected message. In particular, it is a test failure if you call ignoreMessage and the message is not generated.
An example of how ignoreMessage works is shown below.
Example 23. Example of using ignoreMessage
void testDate::testValidity()
QTest::ignoreMessage(QtWarningMsg, "validity warning"); qWarning("validity warning");
void testDate::testValiditi() {
QTest::ignoreMessage(QtWarningMsg, "validity warning"); qWarning("validiti warning");
Example 24. Output of ignoreMessage example
$ ./tutorial4 testValidity testValiditi
Config: Using QTest library 4.1.0, Qt 4.1.0-snapshot-20051107 PASS : testDate::initTestCase() PASS : testDate::testValidity() QWARN : testDate::testValiditi() validiti warning INFO : testDate::testValiditi() Did not receive message: "validity warning" FAIL! : testDate::testValiditi() Not all expected messages were received PASS : testDate::cleanupTestCase() Totals: 3 passed, 1 failed, 0 skipped
Note that the warning message in testDate::testValidity has been "swallowed" by the the call to ignoreMessage.
By contrast, the warning message in testDate::testValiditi still causes a warning to be logged, because the ignoreMessage call does not match the text in the warning message. In addition, because a we expected a particular warning message and it wasn't received, the testDate::testValiditi test function fails.
An important part of Qt programming is the use of signals and slots. This section covers the support for testing of these features.
|Note: If you are not familiar with Qt signals and slots, you probably should review the introduction to this feature provided in your Qt documentation. It is also available at http://doc.trolltech.com/latest/signalsandslots.html. You also might like to review Tutorial 5 in your Qt documentation. This tutorial is also available at http://doc.trolltech.com/latest/tutorial-t5.html.
Testing slots is very easy, because a slot is just a specially annotated method. You can call slots just like any other method you'd like to test, as shown below:
Example 25. QLabel test code, showing testing of a couple of slots
class testLabel: public QObject {
private slots:
void testChanges();
void testLabel::testChanges() {
QLabel label;
// setNum() is a QLabel slot, but we can just call it like any // other method. label.setNum( 3 ); QCOMPARE( label.text(), QString("3") );
// clear() is also a slot. label.clear(); QVERIFY( label.text().isEmpty() );
Testing of signals is a little more difficult than testing of slots, however Qt offers a very useful class called QSignalSpy that helps a lot.
QSignalSpy is a class provided with Qt that allows you to record the signals that have been emitted from a particular QObject subclass object. You can then check that the right number of signals have been emitted, and that the right kind of signals were emitted. You can find more information on the QSignalSpy class in your Qt documentation.
An example of how you can use QSignalSpy to test a class that has signals is shown below.
Example 26. QCheckBox test code, showing testing of signals
class testCheckBox: public QObject {
private slots:
void testSignals();
void testCheckBox::testSignals() {
// You don't need to use an object created with "new" for // QSignalSpy, I just needed it in this case to test the emission // of a destroyed() signal. QCheckBox *xbox = new QCheckBox;
// We are going to have two signal monitoring classes in use for // this test. // The first monitors the stateChanged() signal. // Also note that QSignalSpy takes a pointer to the object. QSignalSpy stateSpy( xbox, SIGNAL( stateChanged(int) ) ); // Not strictly necessary, but I like to check that I have set up // my QSignalSpy correctly. QVERIFY( stateSpy.isValid() );
// Now we check to make sure we don't have any signals already QCOMPARE( stateSpy.count(), 0 );
// Here is a second monitoring class - this one for the // destroyed() signal. QSignalSpy destroyedSpy( xbox, SIGNAL( destroyed() ) ); QVERIFY( destroyedSpy.isValid() );
// A sanity check to verify the initial state // This also shows that you can mix normal method checks with // signal checks. QCOMPARE( xbox->checkState(), Qt::Unchecked );
// Shouldn't already have any signals QCOMPARE( destroyedSpy.count(), 0 );
// If we change the state, we should get a signal. xbox->setCheckState( Qt::Checked ); QCOMPARE( stateSpy.count(), 1 );
xbox->setCheckState( Qt::Unchecked ); QCOMPARE( stateSpy.count(), 2 );
xbox->setCheckState( Qt::PartiallyChecked ); QCOMPARE( stateSpy.count(), 3 );
// If we destroy the object, the signal should be emitted. delete xbox;
// So the count of objects should increase. QCOMPARE( destroyedSpy.count(), 1 );
// We can also review the signals that we collected // QSignalSpy is really a QList of QLists, so we take the first // list, which corresponds to the arguments for the first signal // we caught. QList<QVariant> firstSignalArgs = stateSpy.takeFirst(); // stateChanged() only has one argument - an enumerated type (int) // So we take that argument from the list, and turn it into an integer. int firstSignalState = firstSignalArgs.at(0).toInt(); // We can then check we got the right kind of signal. QCOMPARE( firstSignalState, static_cast<int>(Qt::Checked) );
// check the next signal - note that takeFirst() removes from the list QList<QVariant> nextSignalArgs = stateSpy.takeFirst(); // this shows another way of fudging the argument types Qt::CheckState nextSignalState = (Qt::CheckState)nextSignalArgs.at(0).toInt(); QCOMPARE( nextSignalState, Qt::Unchecked );
// and again for the third signal nextSignalArgs = stateSpy.takeFirst(); nextSignalState = (Qt::CheckState)nextSignalArgs.at(0).toInt(); QCOMPARE( nextSignalState, Qt::PartiallyChecked );
The first 11 lines are essentially unchanged from previous examples that we've seen. Line 15 creates the object that will be tested - as noted in the comments in lines 12-14, the only reason that I'm creating it with new is because I need to delete it in line 45 to cause the destroyed() signal to be emitted.
Line 20 sets up the first of our two QSignalSpy instances. The one in line 20 monitors the stateChanged(int) signal, and the one in line 29 monitors the destroyed() signal. If you get the name or signature of the signal wrong (for example, if you use stateChanged() instead of stateChanged(int)), then this will not be caught at compile time, but will result in a runtime failure. You can test if things were set up correctly using the isValid(), as shown in lines 24 and 30.
As shown in line 34, there is no reason why you cannot test normal methods, signals and slots in the same test.
Line 38 changes the state of the object under test, which is supposed to result in a stateChanged(int) signal being emitted. Line 39 checks that the number of signals increases from zero to one. Lines 40 and 41 repeat the process, and again in lines 42 and 43.
Line 45 deletes the object under test, and line 47 tests that the destroyed() signal has been emitted.
For signals that have arguments (such as our stateChanged(int) signal), you may also wish to check that the arguments were correct. You can do this by looking at the list of signal arguments. Exactly how you do this is fairly flexible, however for simple tests like the one in the example, you can manually work through the list using takeFirst() and check that each argument is correct. This is shown in line 52, 55 and 57 for the first signal. The same approach is shown in lines 59, 61 and 62 for the second signal, and the in lines 64 to 66 for the third signal. For a more complex set of tests, you may wish to apply some data driven techniques.
|Note: You should be aware that, for some class implementations, you may need to return control to the event loop to have signals emitted. If you need this, try using the QTest::qWait() function.
The KDE4 build tool is CMake, and I assume that you are familiar with the use of CMake. If not, you should review the CMake Tutorial first.
CMake offers quite good support for unit testing, and QTestLib tests can be easily integrated into any CMake build system.
Tests are not built by default - you have to enable the test system, and build the tests.
You enable tests by adding an ENABLE_TESTING() line to the top of your CMakeLists.txt file.
In some configurations, there may be a build system option to turn on (or off) the compilation of tests. At this stage, you have to enable the BUILD_TESTING option in KDE4 modules, however this may go away in the near future, as later version of CMake can build the test applications on demand.
If the tests are still not building, you might want to issue make buildtests in tests directory.
You add a single test to the list of all tests that can be run by using ADD_TEST, which takes a number of arguments:
Note that ADD_TEST does nothing if ENABLE_TESTING() has not been run.
When choosing a display name, you should adopt a similar convention to the existing tests (e.g. in kdelibs/kdecore, all the display names start with kdecore-, which makes it easy to find the failing test if you run all the tests in kdelibs). If there are no existing tests, using a submodule prefix is probably a good idea.
The executable doesn't need to be something you build, but it will be for QTestLib, and many other tests. Remember that you need to specify the path, so this normally looks something like "${EXECUTABLE_OUTPUT_PATH}/testapp".
If you are working in a KDE4 environment, then it is pretty easy to get CMake set up to build and run a test on demand.
set( kwhatevertest_SRCS kwhatevertest.cpp )
kde4_add_unit_test( kwhatevertest
TESTNAME ksubmodule-kwhatevertest ${kwhatevertest_SRCS}
target_link_libraries( kwhatevertest
You are meant to replace "kwhatevertest" with the name of your test application. The target_link_libraries() line will need to contain whatever libraries are needed for the feature you are testing, so if it is a GUI feature, you'll likely need to use "${KDE4_KDEUI_LIBS}.
To run all tests, you can just "make test". This will work through each of the tests that have been added (at any lower level) using kde4_add_unit_test, provided that you have include(KDE4Defaults) in your CMakeLists.txt.
This is equivalent to running the "ctest" executable with no arguments. If you want finer grained control over which tests are run or the output format, you can use additional arguments. These are explained in the ctest man page ("man ctest" on a *nix system, or run "ctest --help-full").
To run a single test, use ./tutorial1.shell rather than just ./tutorial1, this will make it use the locally-built version of the shared libraries you're testing, rather than the installed ones.
Chapter 8 of the CMake Book provides a detailed description of how to do testing with CMake. Also see Appendix B for more on CTest and the special commands you can use.
Various sections of the CMake Wiki, especially CTest testing
For KDE specific enhancements see API dox
There are a range of alternative testing approaches that can be used either with unit tests, or as an addition to the unit tests.
As noted in the introduction, unit tests are dynamic tests - they exercise the compiled code. Static tests are slightly different - they look for problems in source code, rather than making sure that the object code runs correctly.
Static test tools tend to identify completely different types of problems to unit tests, and you should seek to use them both.
For more information on using static tests, see the Code Checking tutorial.
Squish by froglogic and KDExecutor by Klarälvdalens Datakonsult (KDAB) are commercial tools that facilitate GUI testing.


text:
The section of the presidential debate on government's proper function was pretty thin.
In today's New York Times, Peter Baker characterizes last night's presidential race as presenting a stark contrast "over the very role of government in American society in a time of wrenching problems."
"On one side," he writes, "was an incumbent who, while recognizing that government is not the solution to all problems, argued that it plays an essential part in promoting economic growth and ensuring fairness for various segments of the population. On the other was a challenger who, while recognizing the basic value of government, argued that its greatest goal was to get out of the way of a free people and unleash the American entrepreneurial spirit."
I'd argue that there was less than meets the eye in the debate to this contrast, and that precious little time was devoted to a genuine exploration of its implications. For starters, as Baker notes, both President Obama and Mitt Romney gave considerable ground on the issue--Obama by recognizing the limitations on government's effectiveness and Romney by saying that his anti-regulatory push doesn't mean that he hates all regulations.
What's more, as I observed while watching the debate, both candidates offered precious little substance on the subject of the role of government. Asked specifically about their philosophies, both candidates spent much of their time making the point that defending the country was job one of government, and then pivoted to standard positions on policy positions such as education.
Beyond that, scattered throughout the debate there were references to consolidating programs here and there, talk of achievements like cutting improper payments in Medicare, and a pro forma promise from Romney to cut the federal workforce through attrition. But there was no exploration of issues like transparency and openness in government, management of information technology, procurement policy or workforce planning.
You might argue that a presidential debate is never going to be the place for a substantive, wonkish seminar about such subjects. If so, I'd encourage you to go back and watch the parts devoted to taxes, which got very wonkish indeed. But in a debate that nominally featured an entire segment devoted to government's role, the discussion that ensued on that subject was pretty thin.
NEXT STORY: Liveblog: First Presidential Debate