#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
# Custom configuration file used by most JUnit tests overriding
# certain default values in src/main/resources/ini/jspwiki.properties
#
About.txt
ApprovalRequiredForPageChanges.txt
ApprovalRequiredForUserProfiles.txt
Community.txt
CopyrightNotice.txt
EditFindAndReplaceHelp.txt
EditPageHelp.txt
FullRecentChanges.txt
InstallationTips.txt
LeftMenu.txt
LeftMenuFooter.txt
LoginHelp.txt
Main.txt
MoreMenu.txt
OneMinuteWiki.txt
PageAlias.txt
PageIndex.txt
RecentChanges.txt
RejectedMessage.txt
SandBox.txt
SearchPageHelp.txt
SystemInfo.txt
TextFormattingRules.txt
TitleBox.txt
UndefinedPages.txt
UnusedPages.txt
WikiEtiquette.txt