├── plugins ├── id │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ └── jmock-id-plugin-messages_en.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MGuid.java │ │ │ ├── MUuid.java │ │ │ └── IDDocMessage.java │ └── pom.xml ├── car │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-car-plugin-messages_en.properties │ │ │ │ └── jmock-car-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MHorsepower.java │ │ │ ├── MDrivetrain.java │ │ │ ├── MEngine.java │ │ │ ├── CarDocMessage.java │ │ │ ├── MVehicle.java │ │ │ └── MBrand.java │ └── pom.xml ├── code │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-code-plugin-messages_en.properties │ │ │ │ └── jmock-code-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MErrorType.java │ │ │ ├── MProgrammingLanguage.java │ │ │ └── CodeDocMessage.java │ └── pom.xml ├── date │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MRangeDate.java │ │ │ └── MTimestamp.java │ └── pom.xml ├── hash │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-hash-plugin-messages_en.properties │ │ │ │ └── jmock-hash-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ └── HashDocMessage.java │ └── pom.xml ├── locale │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-locale-plugin-messages_en.properties │ │ │ │ └── jmock-locale-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ └── LocaleDocMessage.java │ └── pom.xml ├── user │ ├── src │ │ └── main │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ └── cloud.xcan.jmock.api.MockFunction │ └── pom.xml ├── web │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-web-plugin-messages_en.properties │ │ │ │ └── jmock-web-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── WebDocMessage.java │ │ │ └── MEmoji.java │ └── pom.xml ├── article │ ├── src │ │ └── main │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ └── cloud.xcan.jmock.api.MockFunction │ └── pom.xml ├── basic │ ├── src │ │ └── main │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ └── cloud.xcan.jmock.api.MockFunction │ └── pom.xml ├── company │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-company-plugin-messages_en.properties │ │ │ │ └── jmock-company-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ └── CompanyDocMessage.java │ └── pom.xml ├── compute │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MRam.java │ │ │ ├── MBrowser.java │ │ │ ├── MVulnerability.java │ │ │ └── MFilePath.java │ └── pom.xml ├── crypto │ ├── src │ │ └── main │ │ │ └── resources │ │ │ ├── META-INF │ │ │ └── services │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ └── jmock-crypto-plugin-messages_en.properties │ └── pom.xml ├── network │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ ├── MIPv4.java │ │ │ ├── MIPv6.java │ │ │ ├── MMac.java │ │ │ └── MAppName.java │ └── pom.xml ├── financial │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── META-INF │ │ │ │ └── services │ │ │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ │ │ └── cloud.xcan.jmock.api.MockFunction │ │ │ └── i18n │ │ │ │ ├── jmock-financial-plugin-messages_en.properties │ │ │ │ └── jmock-financial-plugin-messages.properties │ │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── plugin │ │ │ └── FinancialDocMessage.java │ └── pom.xml ├── geography │ ├── src │ │ └── main │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ ├── cloud.xcan.jmock.api.i18n.RegisterDocMessage │ │ │ └── cloud.xcan.jmock.api.MockFunction │ └── pom.xml └── pom.xml ├── api ├── src │ └── main │ │ └── java │ │ └── cloud │ │ └── xcan │ │ └── jmock │ │ └── api │ │ ├── AbstractMockFunction.java │ │ ├── MockFunction.java │ │ ├── i18n │ │ ├── RegisterDocMessage.java │ │ ├── JMockFuncDocMessage.java │ │ ├── ThreadLocaleHolder.java │ │ └── JMockMessage.java │ │ ├── docs │ │ └── annotation │ │ │ ├── JMockParameter.java │ │ │ ├── JMockConstructor.java │ │ │ └── JMockFunctionRegister.java │ │ ├── TokenChars.java │ │ ├── support │ │ ├── utils │ │ │ ├── RandomEmailUtils.java │ │ │ ├── ColorUtil.java │ │ │ └── AppVersionUtils.java │ │ └── revreg │ │ │ └── RegRandom.java │ │ ├── Token.java │ │ ├── exception │ │ ├── AbstractParseException.java │ │ └── ParamParseException.java │ │ └── FunctionToken.java └── pom.xml ├── core ├── src │ ├── main │ │ └── java │ │ │ └── cloud │ │ │ └── xcan │ │ │ └── jmock │ │ │ └── core │ │ │ ├── parser │ │ │ ├── extractor │ │ │ │ ├── MockExtractor.java │ │ │ │ └── DefaultMockExpressionExtractor.java │ │ │ ├── MockFunctionTokenParser.java │ │ │ ├── docs │ │ │ │ └── model │ │ │ │ │ ├── MockParameter.java │ │ │ │ │ ├── MockConstructor.java │ │ │ │ │ └── MockFunction.java │ │ │ └── replacer │ │ │ │ ├── MockReplacer.java │ │ │ │ └── DefaultMockTextReplacer.java │ │ │ ├── exception │ │ │ ├── FunctionEndException.java │ │ │ ├── InvalidNameException.java │ │ │ ├── ConstructorMismatchException.java │ │ │ ├── ExpressionTokenException.java │ │ │ ├── TokenException.java │ │ │ └── FunctionStartException.java │ │ │ └── environment │ │ │ └── Environment.java │ └── test │ │ └── java │ │ └── cloud │ │ └── xcan │ │ └── jmock │ │ └── core │ │ └── support │ │ ├── utils │ │ ├── EmojiGeneratorTest.java │ │ ├── ColorUtilTest.java │ │ └── WeightedRandomSamplingAlgorithmTest.java │ │ └── i18n │ │ └── MessageResourcesTest.java └── pom.xml ├── .gitignore ├── test ├── src │ └── test │ │ └── java │ │ └── cloud │ │ └── xcan │ │ └── jmock │ │ └── plugin │ │ ├── date │ │ ├── mtimestamp │ │ │ └── MTimestampTest.java │ │ ├── mlocaleTime │ │ │ └── MLocaleTimeMockConstructorTest.java │ │ ├── mlocaledate │ │ │ └── MLocaleDateMockConstructorTest.java │ │ └── mlocaleDateTime │ │ │ └── MLocaleDateTimeMockConstructorTest.java │ │ ├── geography │ │ ├── mcoordinates │ │ │ ├── MCoordinatesMockTest.java │ │ │ └── MCoordinatesMockConstructorTest.java │ │ ├── mlatitude │ │ │ ├── MLatitudeMockTest.java │ │ │ └── MLatitudeMockConstructorTest.java │ │ ├── mlongitude │ │ │ ├── MLongitudeMockTest.java │ │ │ └── MLongitudeMockConstructorTest.java │ │ ├── maddress │ │ │ ├── MAddressMockConstructorTest.java │ │ │ └── MAddressMockTest.java │ │ ├── mcity │ │ │ └── MCityMockConstructorTest.java │ │ └── mcountry │ │ │ └── MCountryMockConstructorTest.java │ │ ├── user │ │ ├── mname │ │ │ ├── MNameMockConstructorTest.java │ │ │ └── MNameMockTest.java │ │ ├── mmobile │ │ │ ├── MMobileMockConstructorTest.java │ │ │ └── MMobileMockTest.java │ │ ├── mlandline │ │ │ ├── MLandlineMockConstructorTest.java │ │ │ └── MLandlineMockTest.java │ │ ├── mlastname │ │ │ └── MLastnameMockConstructorTest.java │ │ ├── mage │ │ │ ├── MAgeMockTest.java │ │ │ └── MAgeMockConstructorTest.java │ │ ├── mgender │ │ │ └── MGenderMockTest.java │ │ ├── memail │ │ │ └── MEmailMockTest.java │ │ ├── mfirstname │ │ │ └── MFirstNameMockConstructorTest.java │ │ └── meducation │ │ │ └── MEducationMockConstructorTest.java │ │ ├── id │ │ ├── mguid │ │ │ └── MGuidMockConstructorTest.java │ │ ├── muuid │ │ │ └── MUuidMockConstructorTest.java │ │ ├── mincid │ │ │ └── MIncIdMockConstructorTest.java │ │ └── msnowid │ │ │ └── MSnowIdMockConstructorTest.java │ │ ├── hash │ │ └── mmd5 │ │ │ ├── MMd5MockTest.java │ │ │ └── MMd5MockConstructorTest.java │ │ ├── network │ │ ├── mport │ │ │ ├── MPortMockTest.java │ │ │ └── MPortMockConstructorTest.java │ │ ├── mip │ │ │ └── MIpMockTest.java │ │ ├── mprotocol │ │ │ ├── MProtocolMockConstructorTest.java │ │ │ └── MProtocolMockTest.java │ │ └── murl │ │ │ ├── MUrlMockConstructorMockTest.java │ │ │ └── MUrlMockTest.java │ │ ├── basic │ │ ├── menum │ │ │ ├── MEnumMockConstructorTest.java │ │ │ └── MEnumMockTest.java │ │ ├── mregexp │ │ │ ├── MRegExpMockConstructorTest.java │ │ │ └── MRegExpMockTest.java │ │ └── mbool │ │ │ └── MBoolMockTest.java │ │ ├── code │ │ └── CodeDataGeneratorTest.java │ │ ├── locale │ │ ├── mtimezone │ │ │ ├── MTimeZoneMockConstructorTest.java │ │ │ └── MTimeZoneMockTest.java │ │ └── mlocale │ │ │ ├── MLocaleMockTest.java │ │ │ └── MLocaleMockConstructorTest.java │ │ └── article │ │ └── msentence │ │ └── MSentenceMockConstructorTest.java └── pom.xml ├── benchmark ├── src │ └── main │ │ └── java │ │ └── cloud │ │ └── xcan │ │ └── jmock │ │ └── AbstractBenchmark.java └── pom.xml └── bom └── pom.xml /plugins/id/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.IDDocMessage 2 | -------------------------------------------------------------------------------- /plugins/car/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/code/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CodeDocMessage 2 | -------------------------------------------------------------------------------- /plugins/date/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.DateDocMessage 2 | -------------------------------------------------------------------------------- /plugins/hash/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/locale/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/user/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/web/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/article/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.ArticleDocMessage 2 | -------------------------------------------------------------------------------- /plugins/basic/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.BasicDocMessage 2 | -------------------------------------------------------------------------------- /plugins/company/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CompanyDocMessage 2 | -------------------------------------------------------------------------------- /plugins/compute/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.ComputeDocMessage 2 | -------------------------------------------------------------------------------- /plugins/crypto/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CryptoDocMessage 2 | -------------------------------------------------------------------------------- /plugins/network/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.CarDocMessage 2 | -------------------------------------------------------------------------------- /plugins/financial/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.FinancialDocMessage 2 | -------------------------------------------------------------------------------- /plugins/geography/src/main/resources/META-INF/services/cloud.xcan.jmock.api.i18n.RegisterDocMessage: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.GeographyDocMessage 2 | -------------------------------------------------------------------------------- /plugins/hash/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MSha 2 | cloud.xcan.jmock.plugin.MMd5 3 | -------------------------------------------------------------------------------- /plugins/web/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MColor 2 | cloud.xcan.jmock.plugin.MEmoji 3 | -------------------------------------------------------------------------------- /plugins/locale/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MTimeZone 2 | cloud.xcan.jmock.plugin.MLocale 3 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/AbstractMockFunction.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api; 2 | 3 | public abstract class AbstractMockFunction implements MockFunction { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/MockFunction.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api; 2 | 3 | @FunctionalInterface 4 | public interface MockFunction { 5 | 6 | Object mock(); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/i18n/RegisterDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.i18n; 2 | 3 | public interface RegisterDocMessage { 4 | 5 | void register(); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /plugins/id/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MGuid 2 | cloud.xcan.jmock.plugin.MIncId 3 | cloud.xcan.jmock.plugin.MSnowId 4 | cloud.xcan.jmock.plugin.MUuid 5 | -------------------------------------------------------------------------------- /plugins/crypto/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MBase64 2 | cloud.xcan.jmock.plugin.MHash 3 | cloud.xcan.jmock.plugin.MHex 4 | cloud.xcan.jmock.plugin.MKeyPair 5 | cloud.xcan.jmock.plugin.MSymmetricKey 6 | -------------------------------------------------------------------------------- /plugins/date/src/main/java/cloud/xcan/jmock/plugin/MRangeDate.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | public class MRangeDate { 4 | 5 | private String from; 6 | private String to; 7 | private String inFormat; 8 | private String outFormat; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /plugins/code/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MCodeSnippet 2 | cloud.xcan.jmock.plugin.MHtml 3 | cloud.xcan.jmock.plugin.MMarkdown 4 | cloud.xcan.jmock.plugin.MErrorType 5 | cloud.xcan.jmock.plugin.MProgrammingLanguage 6 | -------------------------------------------------------------------------------- /plugins/company/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MCodeSnippet 2 | cloud.xcan.jmock.plugin.MHtml 3 | cloud.xcan.jmock.plugin.MMarkdown 4 | cloud.xcan.jmock.plugin.MErrorType 5 | cloud.xcan.jmock.plugin.MProgrammingLanguage 6 | -------------------------------------------------------------------------------- /plugins/financial/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MAmount 2 | cloud.xcan.jmock.plugin.MBudgetCategory 3 | cloud.xcan.jmock.plugin.MCurrency 4 | cloud.xcan.jmock.plugin.MInvoiceNumber 5 | cloud.xcan.jmock.plugin.MTaxCode 6 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/extractor/MockExtractor.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.extractor; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import java.util.List; 5 | 6 | public interface MockExtractor { 7 | 8 | List extract(); 9 | } 10 | -------------------------------------------------------------------------------- /plugins/car/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MBrand 2 | cloud.xcan.jmock.plugin.MDrivetrain 3 | cloud.xcan.jmock.plugin.MEngine 4 | cloud.xcan.jmock.plugin.MHorsepower 5 | cloud.xcan.jmock.plugin.MPlate 6 | cloud.xcan.jmock.plugin.MVehicle 7 | -------------------------------------------------------------------------------- /plugins/article/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MArticle 2 | cloud.xcan.jmock.plugin.MTitle 3 | cloud.xcan.jmock.plugin.MSentence 4 | cloud.xcan.jmock.plugin.MParagraph 5 | cloud.xcan.jmock.plugin.MTangPoetry 6 | cloud.xcan.jmock.plugin.MWord 7 | -------------------------------------------------------------------------------- /plugins/date/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MTimestamp 2 | cloud.xcan.jmock.plugin.MLocaleDate 3 | cloud.xcan.jmock.plugin.MLocaleDateTime 4 | cloud.xcan.jmock.plugin.MLocaleTime 5 | cloud.xcan.jmock.plugin.MMonth 6 | cloud.xcan.jmock.plugin.MWeek 7 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/MockFunctionTokenParser.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.api.MockFunction; 5 | 6 | public interface MockFunctionTokenParser { 7 | 8 | MockFunction parse(FunctionToken token) throws Exception; 9 | 10 | } 11 | -------------------------------------------------------------------------------- /plugins/basic/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MString 2 | cloud.xcan.jmock.plugin.MInteger 3 | cloud.xcan.jmock.plugin.MLong 4 | cloud.xcan.jmock.plugin.MFloat 5 | cloud.xcan.jmock.plugin.MDouble 6 | cloud.xcan.jmock.plugin.MBool 7 | cloud.xcan.jmock.plugin.MEnum 8 | cloud.xcan.jmock.plugin.MRegExp 9 | -------------------------------------------------------------------------------- /plugins/network/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MPort 2 | cloud.xcan.jmock.plugin.MMac 3 | cloud.xcan.jmock.plugin.MUrl 4 | cloud.xcan.jmock.plugin.MAppVersion 5 | cloud.xcan.jmock.plugin.MIPv4 6 | cloud.xcan.jmock.plugin.MIPv6 7 | cloud.xcan.jmock.plugin.MAppName 8 | cloud.xcan.jmock.plugin.MProtocol 9 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/i18n/JMockFuncDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.i18n; 2 | 3 | public interface JMockFuncDocMessage { 4 | 5 | String DOC_PARAMETER_LOCALE = "jmock.func.parameter.locale"; 6 | String DOC_PARAMETER_DICT = "jmock.func.parameter.dict"; 7 | String DOC_PARAMETER_NULL_WEIGHT = "jmock.func.parameter.nullWeight"; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /plugins/geography/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MProvince 2 | cloud.xcan.jmock.plugin.MAddress 3 | cloud.xcan.jmock.plugin.MLatitude 4 | cloud.xcan.jmock.plugin.MLongitude 5 | cloud.xcan.jmock.plugin.MCoordinates 6 | cloud.xcan.jmock.plugin.MCountry 7 | cloud.xcan.jmock.plugin.MCity 8 | cloud.xcan.jmock.plugin.MZip 9 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/docs/model/MockParameter.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.docs.model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.experimental.Accessors; 6 | 7 | 8 | @Getter 9 | @Setter 10 | @Accessors(chain = true) 11 | public class MockParameter { 12 | 13 | private String name; 14 | 15 | private String description; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /plugins/user/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MAge 2 | cloud.xcan.jmock.plugin.MMobile 3 | cloud.xcan.jmock.plugin.MName 4 | cloud.xcan.jmock.plugin.MPassword 5 | cloud.xcan.jmock.plugin.MEducation 6 | cloud.xcan.jmock.plugin.MLandline 7 | cloud.xcan.jmock.plugin.MLastname 8 | cloud.xcan.jmock.plugin.MEmail 9 | cloud.xcan.jmock.plugin.MFirstname 10 | cloud.xcan.jmock.plugin.MGender 11 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/replacer/MockReplacer.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.replacer; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import java.util.List; 5 | 6 | /** 7 | * Replace the MockFunction function in the text with the function value 8 | */ 9 | public interface MockReplacer { 10 | 11 | String replace(String content) throws Exception; 12 | 13 | String replace(String content, List tokens) throws Exception; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | logs 4 | LOG_HOME_IS_UNDEFINED 5 | CATALINA_BASE_IS_UNDEFINED 6 | log.dir_IS_UNDEFINED 7 | temp 8 | .DS_Store 9 | REF.md 10 | 11 | ### STS ### 12 | .apt_generated 13 | .classpath 14 | .factorypath 15 | .project 16 | .settings 17 | .springBeans 18 | 19 | ### IntelliJ IDEA ### 20 | .idea 21 | *.iws 22 | *.iml 23 | *.ipr 24 | .gitlab-ci.yml 25 | 26 | 27 | ### NetBeans ### 28 | nbproject/private/ 29 | build/ 30 | nbbuild/ 31 | dist/ 32 | nbdist/ 33 | .nb-gradle/ 34 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/docs/model/MockConstructor.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.docs.model; 2 | 3 | import java.util.List; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import lombok.experimental.Accessors; 7 | 8 | @Getter 9 | @Setter 10 | @Accessors(chain = true) 11 | public class MockConstructor { 12 | 13 | private String instance; 14 | 15 | private String description; 16 | 17 | private List parameters; 18 | 19 | private String example; 20 | 21 | private String[] exampleValues; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /plugins/compute/src/main/resources/META-INF/services/cloud.xcan.jmock.api.MockFunction: -------------------------------------------------------------------------------- 1 | cloud.xcan.jmock.plugin.MBrowser 2 | cloud.xcan.jmock.plugin.MCloudService 3 | cloud.xcan.jmock.plugin.MCpuModel 4 | cloud.xcan.jmock.plugin.MDatabase 5 | cloud.xcan.jmock.plugin.MDevice 6 | cloud.xcan.jmock.plugin.MFileName 7 | cloud.xcan.jmock.plugin.MFilePath 8 | cloud.xcan.jmock.plugin.MFramework 9 | cloud.xcan.jmock.plugin.MGpuModel 10 | cloud.xcan.jmock.plugin.MHttpStatus 11 | cloud.xcan.jmock.plugin.MOs 12 | cloud.xcan.jmock.plugin.MRam 13 | cloud.xcan.jmock.plugin.MVulnerability 14 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/i18n/ThreadLocaleHolder.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.i18n; 2 | 3 | import java.util.Locale; 4 | 5 | public class ThreadLocaleHolder { 6 | 7 | public static ThreadLocal localeHolder = new InheritableThreadLocal<>(); 8 | 9 | public static void setLocale(Locale locale) { 10 | localeHolder.set(locale); 11 | } 12 | 13 | public static Locale getLocale() { 14 | Locale locale = localeHolder.get(); 15 | return locale == null ? Locale.getDefault() : locale; 16 | } 17 | 18 | public static void removeLocale() { 19 | localeHolder.remove(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /plugins/id/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.id-plugin 15 | JMock :: Plugin :: ID 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/web/src/main/resources/i18n/jmock-web-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.web=Web Resources 2 | #--------------------------MEmoji------------------------------------ 3 | jmock.func.MEmoji.description=Generate random emojis 4 | jmock.func.MEmoji.C1=Generate random emoji 5 | #--------------------------MColor------------------------------------ 6 | jmock.func.MColor.description=Generate web color values 7 | jmock.func.MColor.parameter.format=Color format (rgb, hsl, hwb, lch, cmyk), default rgb 8 | jmock.func.MColor.C1=Generate random color (default rgb format) 9 | jmock.func.MColor.C2=Generate color in specified format 10 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/docs/model/MockFunction.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.docs.model; 2 | 3 | import java.util.List; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import lombok.experimental.Accessors; 7 | 8 | 9 | @Getter 10 | @Setter 11 | @Accessors(chain = true) 12 | public class MockFunction { 13 | 14 | private String clazz; 15 | 16 | private String name; 17 | 18 | private String description; 19 | 20 | private String[] tags; 21 | 22 | private List constructors; 23 | 24 | private List parameters; 25 | 26 | private int order; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /plugins/car/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.car-plugin 15 | JMock :: Plugin :: Car 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/web/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.web-plugin 15 | JMock :: Plugin :: Web 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/basic/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.basic-plugin 15 | JMock :: Plugin :: Basic 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/code/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.code-plugin 15 | JMock :: Plugin :: Code 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/date/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.date-plugin 15 | JMock :: Plugin :: Date 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/hash/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.hash-plugin 15 | JMock :: Plugin :: Hash 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/user/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.user-plugin 15 | JMock :: Plugin :: User 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/article/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.article-plugin 15 | JMock :: Plugin :: Article 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/company/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.company-plugin 15 | JMock :: Plugin :: Company 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/compute/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.compute-plugin 15 | JMock :: Plugin :: News 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/crypto/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.crypto-plugin 15 | JMock :: Plugin :: Crypto 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/locale/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.locale-plugin 15 | JMock :: Plugin :: Locale 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/network/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.network-plugin 15 | JMock :: Plugin :: Network 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/docs/annotation/JMockParameter.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.docs.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * @author XiaoLong Liu 11 | */ 12 | @Target({ElementType.FIELD}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Documented 15 | public @interface JMockParameter { 16 | 17 | /** 18 | * MockParameter description i18n resource configuration key. 19 | */ 20 | String descI18nKey(); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /plugins/financial/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.financial-plugin 15 | JMock :: Plugin :: Financial 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /plugins/geography/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | xcan-jmock.plugins 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.geography-plugin 15 | JMock :: Plugin :: Geography 16 | jar 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/replacer/DefaultMockTextReplacer.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.replacer; 2 | 3 | 4 | import static org.apache.commons.lang3.ObjectUtils.isEmpty; 5 | 6 | import cloud.xcan.jmock.core.parser.extractor.DefaultMockTextExtractor; 7 | 8 | /** 9 | * @author XiaoLong Liu 10 | */ 11 | public final class DefaultMockTextReplacer extends DefaultMockExpressionReplacer { 12 | 13 | @Override 14 | public synchronized String replace(String content) throws Exception { 15 | if (isEmpty(content)) { 16 | return content; 17 | } 18 | return replace(content, new DefaultMockTextExtractor(content).extract()); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/TokenChars.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api; 2 | 3 | public interface TokenChars { 4 | 5 | String FUNC_NAME_PREFIX = "M"; 6 | 7 | char DEFAULT_ESCAPE_CHAR = '\\'; 8 | 9 | /** 10 | * The default function identifier extractor of the expression 11 | */ 12 | char FUNC_IDENTIFIER = '@'; 13 | char FUNC_PARAM_START = '('; 14 | char FUNC_PARAM_END = ')'; 15 | char FUNC_PARAM_SEPARATOR = ','; 16 | 17 | 18 | /** 19 | * The default method call identifier extractor of the expression 20 | */ 21 | char METHOD_CALL_IDENTIFIER = '$'; 22 | char METHOD_CALL_PARAM_START = '{'; 23 | char METHOD_CALL_PARAM_END = '}'; 24 | char METHOD_CALL_REF_SEPARATOR = '.'; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/support/utils/RandomEmailUtils.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.support.utils; 2 | 3 | /** 4 | * @author Bao Zhang 5 | * @author XiaoLong Liu 6 | */ 7 | public class RandomEmailUtils { 8 | 9 | 10 | /** 11 | *

Returns a random email

12 | * 13 | * @return the random email 14 | */ 15 | public static String email(int min, int max, String[] suffixArray) { 16 | Integer length = RandomUtils.nextInt(min, max); 17 | String prefix = RandomStringUtils.random(length); 18 | Integer dictIndex = RandomUtils.nextInt(0, suffixArray.length); 19 | String suffix = suffixArray[dictIndex]; 20 | return prefix + (suffix.startsWith("@") ? "" : "@") + suffix; 21 | } 22 | 23 | 24 | } 25 | -------------------------------------------------------------------------------- /plugins/hash/src/main/resources/i18n/jmock-hash-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.hash=Hash Algorithm 2 | #--------------------------MSha------------------------------------ 3 | jmock.func.MSha.description=Generate SHA hash values 4 | jmock.func.MSha.parameter.version=Algorithm version (SHA-1, SHA-224, SHA-256, SHA-384, SHA-512), default SHA-512 5 | jmock.func.MSha.C1=Generate SHA hash (default SHA-512) 6 | jmock.func.MSha.C2=Generate SHA hash with specified version 7 | #--------------------------MMd5------------------------------------ 8 | jmock.func.MMd5.description=Generate MD5 values 9 | jmock.func.MMd5.parameter.length=Digest length (16 or 32), default 32 10 | jmock.func.MMd5.C1=Generate MD5 value (default 32 length) 11 | jmock.func.MMd5.C2=Generate MD5 value with specified length 12 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/date/mtimestamp/MTimestampTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.date.mtimestamp; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MTimestamp; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MTimestampTest { 9 | 10 | @Test 11 | public void case1() throws Exception { 12 | FunctionToken token = new FunctionToken("MTimestamp", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MTimestamp mock = (MTimestamp) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | Long value = mock.mock(); 17 | System.out.println("value = " + value); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/FunctionEndException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | import static cloud.xcan.jmock.api.i18n.JMockMessage.PARAM_END_ERROR_T; 4 | import static cloud.xcan.jmock.api.i18n.ThreadLocaleHolder.getLocale; 5 | 6 | import cloud.xcan.jmock.api.i18n.MessageResources; 7 | 8 | public class FunctionEndException extends ExpressionTokenException { 9 | 10 | public FunctionEndException(String name, int position) { 11 | super(name, position); 12 | } 13 | 14 | public static FunctionEndException of(String name, int position) { 15 | return new FunctionEndException(name, position); 16 | } 17 | 18 | @Override 19 | public String getMessage() { 20 | return MessageResources.getString(PARAM_END_ERROR_T, new Object[]{name, position}, 21 | getLocale()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/environment/Environment.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.environment; 2 | 3 | 4 | import cloud.xcan.jmock.api.MockFunction; 5 | import java.util.Locale; 6 | import java.util.Map; 7 | 8 | public interface Environment { 9 | 10 | void reloadEnvironment(); 11 | 12 | void clearEnvironment(); 13 | 14 | void setLocale(Locale locale); 15 | 16 | Locale getLocale(); 17 | 18 | void registerMockClass(Class clazz); 19 | 20 | void registerMockClass(Class clazz, String alias); 21 | 22 | Class unregisterMockClass(String key); 23 | 24 | Class mockClass(String name); 25 | 26 | Map> mockClass(); 27 | 28 | Map> getMockClass(); 29 | } 30 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/support/revreg/RegRandom.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.support.revreg; 2 | 3 | import com.mifmif.common.regex.Generex; 4 | import java.util.Map; 5 | import java.util.concurrent.ConcurrentHashMap; 6 | 7 | public class RegRandom { 8 | 9 | private static final Map GENEREX_MAP = new ConcurrentHashMap<>(); 10 | 11 | public static String random(String expression) { 12 | Generex generex = getGenerex(expression); 13 | return generex.random(); 14 | } 15 | 16 | private static Generex getGenerex(String expression) { 17 | Generex generex; 18 | if (GENEREX_MAP.containsKey(expression)) { 19 | generex = GENEREX_MAP.get(expression); 20 | } else { 21 | generex = new Generex(expression); 22 | GENEREX_MAP.put(expression, generex); 23 | } 24 | return generex; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/docs/annotation/JMockConstructor.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.docs.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * @author XiaoLong Liu 11 | */ 12 | @Target({ElementType.CONSTRUCTOR}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Documented 15 | public @interface JMockConstructor { 16 | 17 | /** 18 | * MockConstructor description i18n resource configuration key. 19 | */ 20 | String descI18nKey() default ""; 21 | 22 | /** 23 | * Example of constructor. 24 | */ 25 | String example() default ""; 26 | 27 | /** 28 | * MockConstructor or parameter example values. 29 | */ 30 | String[] exampleValues() default {}; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /plugins/web/src/main/resources/i18n/jmock-web-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.web=\u7F51\u9875\u5E94\u7528 2 | #--------------------------MEmoji------------------------------------ 3 | jmock.func.MEmoji.description=\u751F\u6210\u968F\u673AEmoji\u8868\u60C5\u7B26 4 | jmock.func.MEmoji.C1=\u751F\u6210\u968F\u673AEmoji\u8868\u60C5\u7B26 5 | #--------------------------MColor------------------------------------ 6 | jmock.func.MColor.description=\u751F\u6210Web\u989C\u8272\u503C 7 | jmock.func.MColor.parameter.format=\u989C\u8272\u683C\u5F0F\uFF0C\u652F\u6301\u503C\uFF1Argb\u3001hsl\u3001hwb\u3001lch\u3001cmyk\uFF0C\u4E0D\u6307\u5B9A\u6216\u8005\u6307\u5B9A\u4E0D\u652F\u6301\u683C\u5F0F\u65F6\u9ED8\u8BA4 rgb 8 | jmock.func.MColor.C1=\u751F\u6210\u9ED8\u8BA4 rgb \u683C\u5F0F\u968F\u673A\u989C\u8272\u503C 9 | jmock.func.MColor.C2=\u751F\u6210\u6307\u5B9A\u683C\u5F0F\u968F\u673A\u989C\u8272\u503C 10 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mcoordinates/MCoordinatesMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mcoordinates; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MCoordinates; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MCoordinatesMockTest { 10 | 11 | @Test 12 | public void case1_defaultConstructorTest() throws Exception { 13 | FunctionToken token = new FunctionToken("Coordinates", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MCoordinates mock = (MCoordinates) parser.parse(token); 16 | for (int i = 0; i < 10; i++) { 17 | String str = mock.mock(); 18 | Assertions.assertEquals(2, str.split(",").length); 19 | } 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/Token.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api; 2 | 3 | /** 4 | * A extractor is an abstraction of a function or method call expression. 5 | * 6 | * @author XiaoLong Liu 7 | */ 8 | public interface Token { 9 | 10 | /** 11 | * Token name 12 | */ 13 | String name(); 14 | 15 | /** 16 | * Index of first character 17 | */ 18 | int startPos(); 19 | 20 | /** 21 | * Index of char after the last character 22 | */ 23 | int endPos(); 24 | 25 | String token(); 26 | 27 | Token NOOP = new Token() { 28 | @Override 29 | public String name() { 30 | return "NOOP"; 31 | } 32 | 33 | @Override 34 | public int startPos() { 35 | return -1; 36 | } 37 | 38 | @Override 39 | public int endPos() { 40 | return -1; 41 | } 42 | 43 | @Override 44 | public String token() { 45 | return "@NOOP()"; 46 | } 47 | 48 | }; 49 | } 50 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mlatitude/MLatitudeMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mlatitude; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MLatitude; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MLatitudeMockTest { 10 | 11 | @Test 12 | public void case1_defaultConstructorTest() throws Exception { 13 | FunctionToken token = new FunctionToken("Latitude", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MLatitude mock = (MLatitude) parser.parse(token); 16 | for (int i = 0; i < 100; i++) { 17 | String str = mock.mock(); 18 | Assertions.assertTrue( 19 | mock.getMinLat() < Double.parseDouble(str) && Double.parseDouble(str) < mock.getMaxLat()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mlongitude/MLongitudeMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mlongitude; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MLongitude; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MLongitudeMockTest { 10 | 11 | @Test 12 | public void case1_defaultConstructorTest() throws Exception { 13 | FunctionToken token = new FunctionToken("Longitude", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MLongitude mock = (MLongitude) parser.parse(token); 16 | for (int i = 0; i < 100; i++) { 17 | String str = mock.mock(); 18 | Assertions.assertTrue( 19 | mock.getMinLng() < Double.parseDouble(str) && Double.parseDouble(str) < mock.getMaxLng()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /plugins/web/src/main/java/cloud/xcan/jmock/plugin/WebDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class WebDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 10xx. 10 | */ 11 | public static final String DOC_CATEGORY_WEB = "jmock.func.category.web"; 12 | 13 | public static final String DOC_COLOR_DESC = "jmock.func.MColor.description"; 14 | public static final String DOC_COLOR_PARAMETER_FORMAT = "jmock.func.MColor.parameter.format"; 15 | public static final String DOC_COLOR_C1 = "jmock.func.MColor.C1"; 16 | public static final String DOC_COLOR_C2 = "jmock.func.MColor.C2"; 17 | 18 | public static final String DOC_EMOJI_DESC = "jmock.func.MEmoji.description"; 19 | public static final String DOC_EMOJI_C1 = "jmock.func.MEmoji.C1"; 20 | 21 | @Override 22 | public void register() { 23 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-web-plugin-messages"); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/parser/extractor/DefaultMockExpressionExtractor.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.parser.extractor; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.exception.FunctionStartException; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public final class DefaultMockExpressionExtractor extends DefaultMockTextExtractor { 9 | 10 | public DefaultMockExpressionExtractor(String expression) { 11 | super(expression); 12 | } 13 | 14 | public DefaultMockExpressionExtractor(String expression, char escapeChar, char funcIdentifier) { 15 | super(expression, escapeChar, funcIdentifier); 16 | } 17 | 18 | @Override 19 | public List extract() { 20 | skipWhitespace(); 21 | 22 | if (pos > maxPos || chars[pos] != funcIdentifier) { 23 | throw FunctionStartException.of(funcIdentifier, pos); 24 | } 25 | 26 | List tokens = new ArrayList<>(1); 27 | tokens.add(parseFunctionToken()); 28 | return tokens; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/InvalidNameException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | import static cloud.xcan.angus.spec.utils.ObjectUtils.isEmpty; 4 | import static cloud.xcan.jmock.api.i18n.ThreadLocaleHolder.getLocale; 5 | 6 | import cloud.xcan.jmock.api.i18n.MessageResources; 7 | 8 | public class InvalidNameException extends TokenException { 9 | 10 | private final String messageKey; 11 | 12 | public InvalidNameException(String name, int position, String messageKey) { 13 | super(name, position); 14 | this.messageKey = messageKey; 15 | } 16 | 17 | public static InvalidNameException of(String name, int position, String messageKey) { 18 | return new InvalidNameException(name, position, messageKey); 19 | } 20 | 21 | @Override 22 | public String getMessage() { 23 | if (isEmpty(name)) { 24 | return MessageResources.getString(messageKey, new Object[]{position}, getLocale()); 25 | } else { 26 | return MessageResources.getString(messageKey, new Object[]{name, position}, getLocale()); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mname/MNameMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mname; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MName; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MNameMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MFirstname() throws Exception { 15 | FunctionToken token = new FunctionToken("MName", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MName mock = (MName) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | } 20 | 21 | @Test 22 | public void MFirstname_1() throws Exception { 23 | FunctionToken token = new FunctionToken("MName", new String[]{"cn"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MName mock = (MName) parser.parse(token); 26 | Assertions.assertNotNull(mock); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/ConstructorMismatchException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | 4 | import static cloud.xcan.jmock.api.i18n.JMockMessage.PARSER_CONSTRUCTOR_MISMATCH_T; 5 | import static cloud.xcan.jmock.api.i18n.ThreadLocaleHolder.getLocale; 6 | 7 | import cloud.xcan.jmock.api.exception.AbstractParseException; 8 | import cloud.xcan.jmock.api.i18n.MessageResources; 9 | 10 | public class ConstructorMismatchException extends AbstractParseException { 11 | 12 | /** 13 | * MockFunction name 14 | */ 15 | private final String name; 16 | 17 | public ConstructorMismatchException(String name) { 18 | super(-1); 19 | this.name = name; 20 | } 21 | 22 | public static ConstructorMismatchException of(String name) { 23 | return new ConstructorMismatchException(name); 24 | } 25 | 26 | @Override 27 | public String getMessage() { 28 | return MessageResources.getString(PARSER_CONSTRUCTOR_MISMATCH_T, new Object[]{name}, 29 | getLocale()); 30 | } 31 | 32 | public String getName() { 33 | return name; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /benchmark/src/main/java/cloud/xcan/jmock/AbstractBenchmark.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | import org.openjdk.jmh.annotations.BenchmarkMode; 5 | import org.openjdk.jmh.annotations.Fork; 6 | import org.openjdk.jmh.annotations.Measurement; 7 | import org.openjdk.jmh.annotations.Mode; 8 | import org.openjdk.jmh.annotations.OutputTimeUnit; 9 | import org.openjdk.jmh.annotations.Scope; 10 | import org.openjdk.jmh.annotations.State; 11 | import org.openjdk.jmh.annotations.Warmup; 12 | 13 | @BenchmarkMode(Mode.Throughput) 14 | @OutputTimeUnit(TimeUnit.SECONDS) 15 | @Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) 16 | @Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS) 17 | @Fork(value = 0, jvmArgs = {"-server", "-Xms256M", "-Xmx256M"}) 18 | @State(Scope.Thread) 19 | public abstract class AbstractBenchmark { 20 | 21 | /** 22 | * Create a new instance. 23 | */ 24 | protected AbstractBenchmark() { 25 | // Hide public constructor to prevent instantiation 26 | } 27 | 28 | // Empty. Serves as an annotation placeholder. 29 | } 30 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/exception/AbstractParseException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.exception; 2 | 3 | 4 | public abstract class AbstractParseException extends RuntimeException { 5 | 6 | /** 7 | * -1 if not known; should be known in all reasonable cases 8 | */ 9 | protected int position; 10 | 11 | /** 12 | * Construct a new parse exception. 13 | */ 14 | public AbstractParseException() { 15 | this(-1); 16 | } 17 | 18 | /** 19 | * Construct a new parse exception. 20 | * 21 | * @param position the position in the expression mstring where the problem occurred 22 | */ 23 | public AbstractParseException(int position) { 24 | this.position = position; 25 | } 26 | 27 | /** 28 | * Return the position in the mstring where the problem occurred. 29 | */ 30 | public int getPosition() { 31 | return this.position; 32 | } 33 | 34 | /** 35 | * Return a detailed locale description of this exception, including the mstring and position (if 36 | * available). 37 | */ 38 | @Override 39 | public abstract String getMessage(); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mmobile/MMobileMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mmobile; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MMobile; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MMobileMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MLandline() throws Exception { 15 | FunctionToken token = new FunctionToken("MMobile", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MMobile mock = (MMobile) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | } 20 | 21 | @Test 22 | public void MLandline_1() throws Exception { 23 | FunctionToken token = new FunctionToken("MMobile", new String[]{"en"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MMobile mock = (MMobile) parser.parse(token); 26 | Assertions.assertNotNull(mock); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/docs/annotation/JMockFunctionRegister.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.docs.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * @author XiaoLong Liu 11 | */ 12 | @Target({ElementType.TYPE}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Documented 15 | public @interface JMockFunctionRegister { 16 | 17 | /** 18 | * Function category i18n resource configuration key for group and search. 19 | *

20 | * Available values:BASIC, ID, USER, LOCATION, APP, IT, CAR, CRYPTO, GEO, COMMERCE ... 21 | *

22 | * Usage:classification=PERSONAL,LOCATION 23 | */ 24 | String[] categoryI18nKey(); 25 | 26 | /** 27 | * Function description i18n resource configuration key. 28 | */ 29 | String descI18nKey(); 30 | 31 | /** 32 | * The order of control functions in the api or web interface, smaller and higher. 33 | */ 34 | int order() default 10000; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /plugins/company/src/main/resources/i18n/jmock-company-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.company=Company 2 | #--------------------------MCompany--------------------------- 3 | jmock.func.MCompany.description=Generate company 4 | jmock.func.MCompany.C1=Generate default Chinese company name 5 | jmock.func.MCompany.C2=Generate specified language company name 6 | #--------------------------MDepartment--------------------------- 7 | jmock.func.MDepartment.description=Generate department 8 | jmock.func.MDepartment.C1=Generate default Chinese department name 9 | jmock.func.MDepartment.C2=Generate specified language department name 10 | #--------------------------MIndustry--------------------------- 11 | jmock.func.MIndustry.description=Generate industry 12 | jmock.func.MIndustry.C1=Generate default Chinese industry name 13 | jmock.func.MIndustry.C2=Generate specified language industry name 14 | #--------------------------MJob--------------------------- 15 | jmock.func.MJob.description=Generate job title 16 | jmock.func.MJob.C1=Generate default Chinese job title 17 | jmock.func.MJob.C2=Generate specified language job title 18 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mlandline/MLandlineMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mlandline; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLandline; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLandlineMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MLandline() throws Exception { 15 | FunctionToken token = new FunctionToken("MLandline", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MLandline mock = (MLandline) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | } 20 | 21 | @Test 22 | public void MLandline_1() throws Exception { 23 | FunctionToken token = new FunctionToken("MLandline", new String[]{"en"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MLandline mock = (MLandline) parser.parse(token); 26 | Assertions.assertNotNull(mock); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /plugins/hash/src/main/resources/i18n/jmock-hash-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.hash=\u54C8\u5E0C\u7B97\u6CD5 2 | #--------------------------MSha------------------------------------ 3 | jmock.func.MSha.description=\u751F\u6210\u968F\u673A\u54C8\u5E0C\u503C 4 | jmock.func.MSha.parameter.version=\u7B97\u6CD5\u7248\u672C\uFF0C\u56FA\u5B9A\u503C\uFF1ASHA-1\u3001SHA-224\u3001SHA-256\u3001SHA-384\u3001SHA-512\uFF0C\u9ED8\u8BA4 SHA-512 5 | jmock.func.MSha.C1=\u751F\u6210\u4E00\u4E2A\u968F\u673A\u54C8\u5E0C\u503C\uFF0C\u7248\u672C\u9ED8\u8BA4SHA-512 6 | jmock.func.MSha.C2=\u751F\u6210\u4E00\u4E2A\u968F\u673A\u54C8\u5E0C\u503C\uFF0C\u7248\u672C\u4F7F\u7528\u6307\u5B9A\u7684version 7 | #--------------------------MMd5------------------------------------ 8 | jmock.func.MMd5.description=\u751F\u6210\u968F\u673AMD5\u503C 9 | jmock.func.MMd5.parameter.length=\u6458\u8981\u957F\u5EA6\uFF0C\u56FA\u5B9A\u503C\uFF1A16\u300132\uFF0C\u9ED8\u8BA4 32 10 | jmock.func.MMd5.C1=\u751F\u6210\u4E00\u4E2AMD5 \u503C\uFF0C\u957F\u5EA6\u9ED8\u8BA4\u4E3A32 11 | jmock.func.MMd5.C2=\u751F\u6210\u4E00\u4E2AMD5 \u503C\uFF0C\u957F\u5EA6\u4F7F\u7528\u6307\u5B9A\u7684length 12 | -------------------------------------------------------------------------------- /plugins/web/src/main/java/cloud/xcan/jmock/plugin/MEmoji.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.WebDocMessage.DOC_CATEGORY_WEB; 4 | import static cloud.xcan.jmock.plugin.WebDocMessage.DOC_EMOJI_C1; 5 | import static cloud.xcan.jmock.plugin.WebDocMessage.DOC_EMOJI_DESC; 6 | 7 | import cloud.xcan.jmock.api.AbstractMockFunction; 8 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 10 | import cloud.xcan.jmock.api.support.utils.EmojiGeneratorUtils; 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | /** 15 | * @author XiaoLong Liu 16 | */ 17 | @Setter 18 | @Getter 19 | @JMockFunctionRegister(descI18nKey = DOC_EMOJI_DESC, 20 | categoryI18nKey = {DOC_CATEGORY_WEB}, order = 1001) 21 | public class MEmoji extends AbstractMockFunction { 22 | 23 | @JMockConstructor(descI18nKey = DOC_EMOJI_C1, 24 | example = "@Emoji()", 25 | exampleValues = {"\uD83D\uDE05", "\uD83D\uDE18"}) 26 | public MEmoji() { 27 | } 28 | 29 | @Override 30 | public Object mock() { 31 | return EmojiGeneratorUtils.getRandomEmoji(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /plugins/network/src/main/java/cloud/xcan/jmock/plugin/MIPv4.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.api.support.utils.IPUtils.ipV4; 4 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_CATEGORY_NETWORK; 5 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_IPV4_C1; 6 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_IPV4_DESC; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | /** 15 | * @author Bao Zhang 16 | * @author XiaoLong Liu 17 | */ 18 | @Setter 19 | @Getter 20 | @JMockFunctionRegister(descI18nKey = DOC_IPV4_DESC, 21 | categoryI18nKey = {DOC_CATEGORY_NETWORK}, order = 903) 22 | public class MIPv4 extends AbstractMockFunction { 23 | 24 | @JMockConstructor(descI18nKey = DOC_IPV4_C1, 25 | example = "@IPv4()", 26 | exampleValues = {"185.122.62.64", "56.106.168.69"}) 27 | public MIPv4() { 28 | } 29 | 30 | @Override 31 | public String mock() { 32 | return ipV4(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /plugins/network/src/main/java/cloud/xcan/jmock/plugin/MIPv6.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.api.support.utils.IPUtils.ipV6; 4 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_CATEGORY_NETWORK; 5 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_IPV6_C1; 6 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_IPV6_DESC; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | /** 15 | * @author Bao Zhang 16 | * @author XiaoLong Liu 17 | */ 18 | @Setter 19 | @Getter 20 | @JMockFunctionRegister(descI18nKey = DOC_IPV6_DESC, 21 | categoryI18nKey = {DOC_CATEGORY_NETWORK}, order = 904) 22 | public class MIPv6 extends AbstractMockFunction { 23 | 24 | @JMockConstructor(descI18nKey = DOC_IPV6_C1, 25 | example = "@IPv4()", 26 | exampleValues = {"185.122.62.64", "56.106.168.69"}) 27 | public MIPv6() { 28 | } 29 | 30 | @Override 31 | public String mock() { 32 | return ipV6(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/id/mguid/MGuidMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.id.mguid; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MGuid; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MGuidMockConstructorTest { 11 | 12 | @Test 13 | public void MGuid1() throws Exception { 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | 16 | FunctionToken token = new FunctionToken("Guid", 17 | new String[]{}); 18 | MGuid mock = (MGuid) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | } 21 | 22 | /** 23 | * Full MockConstructor: @Float(min,max,scale,nullWeight) 24 | */ 25 | @Test 26 | public void MGuid2() throws Exception { 27 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 28 | 29 | FunctionToken token = new FunctionToken("Guid", 30 | new String[]{"true"}); 31 | MGuid mock = (MGuid) parser.parse(token); 32 | Assertions.assertNotNull(mock); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /plugins/hash/src/main/java/cloud/xcan/jmock/plugin/HashDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class HashDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 6xx. 10 | */ 11 | public static final String DOC_CATEGORY_HASH = "jmock.func.category.hash"; 12 | 13 | public static final String DOC_SHA_DESC = "jmock.func.MSha.description"; 14 | public static final String DOC_SHA_PARAMETER_VERSION = "jmock.func.MSha.parameter.version"; 15 | public static final String DOC_SHA_C1 = "jmock.func.MSha.C1"; 16 | public static final String DOC_SHA_C2 = "jmock.func.MSha.C2"; 17 | 18 | public static final String DOC_MD5_DESC = "jmock.func.MMd5.description"; 19 | public static final String DOC_MD5_PARAMETER_LENGTH = "jmock.func.MMd5.parameter.length"; 20 | public static final String DOC_MD5_C1 = "jmock.func.MMd5.C1"; 21 | public static final String DOC_MD5_C2 = "jmock.func.MMd5.C2"; 22 | 23 | @Override 24 | public void register() { 25 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-hash-plugin-messages"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /plugins/network/src/main/java/cloud/xcan/jmock/plugin/MMac.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.api.support.utils.IPUtils.mac; 4 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_CATEGORY_NETWORK; 5 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_MAC_C1; 6 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_MAC_DESC; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | /** 15 | * @author Bao Zhang 16 | * @author XiaoLong Liu 17 | */ 18 | @Setter 19 | @Getter 20 | @JMockFunctionRegister(descI18nKey = DOC_MAC_DESC, 21 | categoryI18nKey = {DOC_CATEGORY_NETWORK}, order = 905) 22 | public class MMac extends AbstractMockFunction { 23 | 24 | @JMockConstructor(descI18nKey = DOC_MAC_C1, 25 | example = "@Mac()", 26 | exampleValues = {"d8:01:8f:96:b1:f4", "65:d2:65:a5:6c:81", "2b:3d:70:76:69:f0"}) 27 | public MMac() { 28 | } 29 | 30 | @Override 31 | public String mock() { 32 | return mac(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/maddress/MAddressMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.maddress; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MAddress; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MAddressMockConstructorTest { 10 | 11 | @Test 12 | public void MAddress1() throws Exception { 13 | FunctionToken token = new FunctionToken("Address", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MAddress mock = (MAddress) parser.parse(token); 16 | Assertions.assertNotNull(mock); 17 | } 18 | 19 | 20 | @Test 21 | public void MAddress2() throws Exception { 22 | FunctionToken token = new FunctionToken("Address", new String[]{"北京海淀|日本东京"}); 23 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 24 | MAddress mock = (MAddress) parser.parse(token); 25 | Assertions.assertNotNull(mock); 26 | Assertions.assertArrayEquals(new String[]{"北京海淀", "日本东京"}, mock.getDictArray()); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mmobile/MMobileMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mmobile; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MMobile; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MMobileMockTest { 9 | 10 | @Test 11 | public void mobile() throws Exception { 12 | FunctionToken token = new FunctionToken("MMobile", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MMobile mock = (MMobile) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String mobile = mock.mock(); 17 | System.out.println("mobile = " + mobile); 18 | } 19 | } 20 | 21 | @Test 22 | public void mobile1() throws Exception { 23 | FunctionToken token = new FunctionToken("MMobile", new String[]{"en"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MMobile mock = (MMobile) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String mobile = mock.mock(); 28 | System.out.println("mobile = " + mobile); 29 | } 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /core/src/test/java/cloud/xcan/jmock/core/support/utils/EmojiGeneratorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.support.utils; 2 | 3 | 4 | import static org.junit.jupiter.api.Assertions.assertNotNull; 5 | import static org.junit.jupiter.api.Assertions.assertTrue; 6 | 7 | import cloud.xcan.jmock.api.support.utils.EmojiGeneratorUtils; 8 | import java.util.HashSet; 9 | import java.util.Set; 10 | import org.junit.jupiter.api.Test; 11 | 12 | public class EmojiGeneratorTest { 13 | 14 | @Test 15 | public void testGetRandomEmoji() { 16 | String emoji = EmojiGeneratorUtils.getRandomEmoji(); 17 | System.out.println(emoji); 18 | assertNotNull(emoji, "The emoji should not be null"); 19 | assertTrue(emoji.length() > 0, "The emoji should not be empty"); 20 | assertTrue(emoji.matches("\\p{So}"), "The emoji should be a symbol character"); 21 | } 22 | 23 | @Test 24 | public void testMultipleRandomEmojis() { 25 | Set emojis = new HashSet<>(); 26 | for (int i = 0; i < 100; i++) { 27 | String emoji = EmojiGeneratorUtils.getRandomEmoji(); 28 | System.out.println(emoji); 29 | emojis.add(emoji); 30 | } 31 | assertTrue(emojis.size() > 1, "There should be multiple different emojis generated"); 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /plugins/locale/src/main/resources/i18n/jmock-locale-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.locale=Localization 2 | jmock.func.data.timezone=Australia/Darwin|Australia/Sydney|America/Argentina/Buenos_Aires|Africa/Cairo|America/Anchorage|America/Sao_Paulo|Asia/Dhaka|Africa/Harare|America/St_Johns|America/Chicago|Asia/Shanghai|Africa/Addis_Ababa|Europe/Paris|America/Indiana/Indianapolis|Asia/Kolkata|Asia/Tokyo|Pacific/Apia|Asia/Yerevan|Pacific/Auckland|Asia/Karachi|America/Phoenix|America/Puerto_Rico|America/Los_Angeles|Pacific/Guadalcanal|Asia/Ho_Chi_Minh 3 | #--------------------------MLocale------------------------------------ 4 | jmock.func.MLocale.description=Generate locale strings (language + country) 5 | jmock.func.MLocale.parameter.joiner=Country/language separator, default "_" 6 | jmock.func.MLocale.C1=Generate locale string 7 | jmock.func.MLocale.C2=Generate locale string with specified separator 8 | #--------------------------MTimeZone------------------------------------ 9 | jmock.func.MTimeZone.description=Generate timezone strings 10 | jmock.func.MTimeZone.parameter.dict=Timezone dictionary, default includes major timezones 11 | jmock.func.MTimeZone.C1=Generate random timezone 12 | jmock.func.MTimeZone.C2=Generate timezone from specified dictionary 13 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/MHorsepower.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_CATEGORY_CAR; 4 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_HORSEPOWER_C1; 5 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_HORSEPOWER_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrand.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | 12 | @JMockFunctionRegister(descI18nKey = DOC_HORSEPOWER_DESC, categoryI18nKey = { 13 | DOC_CATEGORY_CAR}, order = 2004) 14 | public class MHorsepower extends AbstractMockFunction { 15 | 16 | // Horsepower range constants 17 | private static final int MIN_HORSEPOWER = 70; 18 | private static final int MAX_HORSEPOWER = 1000; 19 | 20 | @JMockConstructor(descI18nKey = DOC_HORSEPOWER_C1, 21 | example = "@Horsepower()", 22 | exampleValues = {"723 HP", "71 HP", "982 HP"}) 23 | public MHorsepower() { 24 | } 25 | 26 | @Override 27 | public String mock() { 28 | int hp = random.nextInt(MIN_HORSEPOWER, MAX_HORSEPOWER + 1); 29 | return hp + " HP"; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/hash/mmd5/MMd5MockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.hash.mmd5; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MMd5; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MMd5MockTest { 10 | 11 | @Test 12 | public void case1_defaultSizeTest() throws Exception { 13 | FunctionToken token = new FunctionToken("MMd5", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MMd5 mock = (MMd5) parser.parse(token); 16 | for (int i = 0; i < 10; i++) { 17 | String str = mock.mock(); 18 | Assertions.assertEquals(32, str.length()); 19 | } 20 | } 21 | 22 | @Test 23 | public void case2_16SizeAndMockTest() throws Exception { 24 | FunctionToken token = new FunctionToken("MMd5", new String[]{"16"}); 25 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 26 | MMd5 mock = (MMd5) parser.parse(token); 27 | for (int i = 0; i < 10; i++) { 28 | String str = mock.mock(); 29 | Assertions.assertEquals(16, str.length()); 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mlastname/MLastnameMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mlastname; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLastname; 7 | import java.util.List; 8 | import org.junit.jupiter.api.Assertions; 9 | import org.junit.jupiter.api.Test; 10 | 11 | public class MLastnameMockConstructorTest { 12 | 13 | 14 | @Test 15 | public void MLastname() throws Exception { 16 | FunctionToken token = new FunctionToken("MLastname", new String[]{}); 17 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 18 | MLastname mock = (MLastname) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | Assertions.assertNotNull(mock.mock()); 21 | } 22 | 23 | @Test 24 | public void MLastname_1() throws Exception { 25 | FunctionToken token = new FunctionToken("MLastname", new String[]{"张|王"}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MLastname mock = (MLastname) parser.parse(token); 28 | Assertions.assertNotNull(mock); 29 | Assertions.assertTrue(List.of("张", "王").contains(mock.mock())); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /plugins/car/src/main/resources/i18n/jmock-car-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.car=Car 2 | #--------------------------MBrand------------------------------------ 3 | jmock.func.MBrand.description=Generate car brand 4 | jmock.func.MBrand.C1=Generate a default random car brand 5 | #--------------------------MDrivetrain------------------------------------ 6 | jmock.func.MDrivetrain.description=Generate drivetrain 7 | jmock.func.MDrivetrain.C1=Generate a default random drivetrain type 8 | #--------------------------MEngine------------------------------------ 9 | jmock.func.MEngine.description=Generate car engine 10 | jmock.func.MEngine.C1=Generate a default random car engine type 11 | #--------------------------MHorsepower------------------------------------ 12 | jmock.func.MHorsepower.description=Generate car horsepower 13 | jmock.func.MHorsepower.C1=Generate a default random car horsepower value 14 | #--------------------------MPlate------------------------------------ 15 | jmock.func.MPlate.description=Generate license plate 16 | jmock.func.MPlate.C1=Generate a default random license plate 17 | #--------------------------MVehicle------------------------------------ 18 | jmock.func.MVehicle.description=Generate vehicle 19 | jmock.func.MVehicle.C1=Generate a default random license plate 20 | -------------------------------------------------------------------------------- /plugins/company/src/main/resources/i18n/jmock-company-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.company=\u516C\u53F8 2 | #--------------------------MCompany--------------------------- 3 | jmock.func.MCompany.description=\u751F\u6210\u516C\u53F8 4 | jmock.func.MCompany.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u6587\u516C\u53F8\u540D\u79F0 5 | jmock.func.MCompany.C2=\u751F\u6210\u6307\u5B9A\u8BED\u8A00\u516C\u53F8\u540D\u79F0 6 | #--------------------------MDepartment--------------------------- 7 | jmock.func.MDepartment.description=\u751F\u6210\u90E8\u95E8 8 | jmock.func.MDepartment.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u6587\u90E8\u95E8\u540D\u79F0 9 | jmock.func.MDepartment.C2=\u751F\u6210\u6307\u5B9A\u8BED\u8A00\u90E8\u95E8\u540D\u79F0 10 | #--------------------------MIndustry--------------------------- 11 | jmock.func.MIndustry.description=\u751F\u6210\u884C\u4E1A 12 | jmock.func.MIndustry.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u6587\u884C\u4E1A\u540D\u79F0 13 | jmock.func.MIndustry.C2=\u751F\u6210\u6307\u5B9A\u8BED\u8A00\u884C\u4E1A\u540D\u79F0 14 | #--------------------------MJob--------------------------- 15 | jmock.func.MJob.description=\u751F\u6210\u804C\u79F0 16 | jmock.func.MJob.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u6587\u804C\u79F0 17 | jmock.func.MJob.C2=\u751F\u6210\u6307\u5B9A\u8BED\u8A00\u804C\u79F0 18 | -------------------------------------------------------------------------------- /api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.api 15 | JMock :: Api 16 | jar 17 | 18 | 19 | 20 | cloud.xcan.angus 21 | xcan-infra.spec 22 | 23 | 24 | 25 | com.github.mifmif 26 | generex 27 | ${generex.version} 28 | 29 | 30 | 31 | com.github.ben-manes.caffeine 32 | caffeine 33 | 34 | 35 | 36 | com.google.code.gson 37 | gson 38 | test 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /core/src/test/java/cloud/xcan/jmock/core/support/utils/ColorUtilTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.support.utils; 2 | 3 | import cloud.xcan.jmock.api.support.utils.ColorUtil; 4 | import org.junit.jupiter.api.Test; 5 | 6 | public class ColorUtilTest { 7 | 8 | @Test 9 | public void testRandomHexColor() { 10 | String hexColor = ColorUtil.randomHexColor(); 11 | System.out.println("hexColor: " + hexColor); 12 | } 13 | 14 | @Test 15 | public void testRandomRgbColor() { 16 | String rgbColor = ColorUtil.randomRgbColor(); 17 | System.out.println("rgbColor: " + rgbColor); 18 | } 19 | 20 | @Test 21 | public void testRandomHslColor() { 22 | String hslColor = ColorUtil.randomHslColor(); 23 | System.out.println("hslColor: " + hslColor); 24 | } 25 | 26 | @Test 27 | public void testRandomHwbColor() { 28 | String hwbColor = ColorUtil.randomHwbColor(); 29 | System.out.println("hwbColor: " + hwbColor); 30 | } 31 | 32 | @Test 33 | public void testRandomLchColor() { 34 | String lchColor = ColorUtil.randomLchColor(); 35 | System.out.println("lchColor: " + lchColor); 36 | } 37 | 38 | @Test 39 | public void testRandomCmykColor() { 40 | String cmykColor = ColorUtil.randomCmykColor(); 41 | System.out.println("cmykColor: " + cmykColor); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/id/muuid/MUuidMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.id.muuid; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MUuid; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MUuidMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MUuid1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Uuid", 18 | new String[]{}); 19 | MUuid mock = (MUuid) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(false, mock.getWithoutSeparator()); 22 | } 23 | 24 | /** 25 | * Full MockConstructor: @Float(min,max,scale,nullWeight) 26 | */ 27 | @Test 28 | public void MUuid2() throws Exception { 29 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 30 | 31 | FunctionToken token = new FunctionToken("Uuid", 32 | new String[]{"true"}); 33 | MUuid mock = (MUuid) parser.parse(token); 34 | Assertions.assertNotNull(mock); 35 | Assertions.assertEquals(true, mock.getWithoutSeparator()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /plugins/locale/src/main/java/cloud/xcan/jmock/plugin/LocaleDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class LocaleDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 9xx. 10 | */ 11 | public static final String DOC_CATEGORY_LOCALE = "jmock.func.category.locale"; 12 | 13 | public static final String DATA_TIMEZONE = "jmock.func.data.timezone"; 14 | 15 | public static final String DOC_LOCALE_DESC = "jmock.func.MLocale.description"; 16 | public static final String DOC_LOCALE_PARAMETER_JOINER = "jmock.func.MLocale.parameter.joiner"; 17 | public static final String DOC_LOCALE_C1 = "jmock.func.MLocale.C1"; 18 | public static final String DOC_LOCALE_C2 = "jmock.func.MLocale.C2"; 19 | 20 | public static final String DOC_TIMEZONE_DESC = "jmock.func.MTimeZone.description"; 21 | public static final String DOC_TIMEZONE_PARAMETER_DICT = "jmock.func.MTimeZone.parameter.dict"; 22 | public static final String DOC_TIMEZONE_C1 = "jmock.func.MTimeZone.C1"; 23 | public static final String DOC_TIMEZONE_C2 = "jmock.func.MTimeZone.C2"; 24 | 25 | @Override 26 | public void register() { 27 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-locale-plugin-messages"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/mport/MPortMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.mport; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MPort; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MPortMockTest { 10 | 11 | @Test 12 | public void case1_Test() throws Exception { 13 | FunctionToken token = new FunctionToken("Port", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MPort mock = (MPort) parser.parse(token); 16 | for (int i = 0; i < 100; i++) { 17 | Integer port = mock.mock(); 18 | System.out.println(port); 19 | Assertions.assertTrue(1024 < port && port < 65535); 20 | } 21 | } 22 | 23 | @Test 24 | public void case2_Test() throws Exception { 25 | FunctionToken token = new FunctionToken("Port", new String[]{"2000", "9000"}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MPort mock = (MPort) parser.parse(token); 28 | for (int i = 0; i < 100; i++) { 29 | Integer port = mock.mock(); 30 | System.out.println(port); 31 | Assertions.assertTrue(2000 < port && port < 9000); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/ExpressionTokenException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | public class ExpressionTokenException extends TokenException { 4 | 5 | protected String expression; 6 | 7 | /** 8 | * Construct a new expression extractor parse exception. 9 | * 10 | * @param name Exception extractor name 11 | */ 12 | public ExpressionTokenException(String name) { 13 | this(name, -1); 14 | } 15 | 16 | /** 17 | * Construct a new expression extractor parse exception. 18 | * 19 | * @param name Exception extractor name 20 | * @param position The position in the expression where the problem occurred. 21 | */ 22 | public ExpressionTokenException(String name, int position) { 23 | this(name, position, null); 24 | } 25 | 26 | /** 27 | * Construct a new expression extractor parse exception. 28 | * 29 | * @param name Exception extractor name 30 | * @param position The position in the expression where the problem occurred. 31 | */ 32 | public ExpressionTokenException(String name, int position, String expression) { 33 | super(name, position); 34 | this.expression = expression; 35 | } 36 | 37 | /** 38 | * Return the exception locale message. 39 | */ 40 | @Override 41 | public String getMessage() { 42 | return ""; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /plugins/code/src/main/resources/i18n/jmock-code-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.code=Code 2 | #--------------------------MCodeSnippet------------------------------------ 3 | jmock.func.MCodeSnippet.description=Generate code 4 | jmock.func.MCodeSnippet.parameter.language=Programming language, supported values: PYTHON, JAVA, JAVASCRIPT, TYPESRIPT, CPP, CSHARP, PHP, RUBY, SWIFT, GO 5 | jmock.func.MCodeSnippet.C1=Generate a JAVA code snippet 6 | jmock.func.MCodeSnippet.C2=Generate a specified programming language code snippet 7 | #--------------------------MErrorType------------------------------------ 8 | jmock.func.MErrorType.description=Generate error 9 | jmock.func.MErrorType.C1=Generate a default random exception type 10 | #--------------------------MHtml----------------------------------------- 11 | jmock.func.MHtml.description=Generate HTML content 12 | jmock.func.MHtml.C1=Generate default random HTML content 13 | #--------------------------MMarkdown------------------------------------ 14 | jmock.func.MMarkdown.description=Generate Markdown content 15 | jmock.func.MMarkdown.C1=Generate default random Markdown content 16 | #--------------------------MProgrammingLanguage--------------------------- 17 | jmock.func.MProgrammingLanguage.description=Generate programming language 18 | jmock.func.MProgrammingLanguage.C1=Generate default random programming language 19 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/id/mincid/MIncIdMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.id.mincid; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MIncId; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MIncIdMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MIncId1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("IncId", 18 | new String[]{}); 19 | MIncId mock = (MIncId) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(1, mock.getStep()); 22 | Assertions.assertEquals(1, mock.getLongAdder().intValue()); 23 | } 24 | 25 | @Test 26 | public void MIncId2() throws Exception { 27 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 28 | 29 | FunctionToken token = new FunctionToken("IncId", 30 | new String[]{"2", "3"}); 31 | MIncId mock = (MIncId) parser.parse(token); 32 | Assertions.assertNotNull(mock); 33 | Assertions.assertEquals(3, mock.getStep()); 34 | Assertions.assertEquals(2, mock.getLongAdder().intValue()); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mage/MAgeMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mage; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MAge; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MAgeMockTest { 10 | 11 | @Test 12 | public void case1_defaultRangeTest() throws Exception { 13 | FunctionToken token = new FunctionToken("Age", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MAge mock = (MAge) parser.parse(token); 16 | for (int i = 0; i < 10; i++) { 17 | Integer age = mock.mock(); 18 | System.out.println("value:\t" + age); 19 | Assertions.assertTrue(1 <= age && age <= 100); 20 | } 21 | } 22 | 23 | @Test 24 | public void case2_customizeRangeTest() throws Exception { 25 | FunctionToken token = new FunctionToken("Age", new String[]{"2", "8"}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MAge mock = (MAge) parser.parse(token); 28 | for (int i = 0; i < 10; i++) { 29 | Integer age = mock.mock(); 30 | System.out.println("value:\t" + age); 31 | Assertions.assertTrue(2 <= age && age <= 8); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mlandline/MLandlineMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mlandline; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MLandline; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MLandlineMockTest { 10 | 11 | 12 | @Test 13 | public void case1_defaultTest() throws Exception { 14 | FunctionToken token = new FunctionToken("MLandline", new String[]{}); 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | MLandline mock = (MLandline) parser.parse(token); 17 | for (int i = 0; i < 10; i++) { 18 | String str = mock.mock(); 19 | System.out.println("str = " + str); 20 | Assertions.assertNotNull(str); 21 | } 22 | } 23 | 24 | @Test 25 | public void case2() throws Exception { 26 | FunctionToken token = new FunctionToken("MLandline", new String[]{"en"}); 27 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 28 | MLandline mock = (MLandline) parser.parse(token); 29 | for (int i = 0; i < 10; i++) { 30 | String str = mock.mock(); 31 | System.out.println("str = " + str); 32 | Assertions.assertNotNull(str); 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mage/MAgeMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mage; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MAge; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MAgeMockConstructorTest { 11 | 12 | @Test 13 | public void MAge1() throws Exception { 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | 16 | FunctionToken token = new FunctionToken("Age", 17 | new String[]{}); 18 | MAge mock = (MAge) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | Assertions.assertEquals(1, mock.getMin()); 21 | Assertions.assertEquals(100, mock.getMax()); 22 | } 23 | 24 | /** 25 | * Full MockConstructor: @MAge(min,max) 26 | */ 27 | @Test 28 | public void MAge2() throws Exception { 29 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 30 | 31 | FunctionToken token = new FunctionToken("Age", 32 | new String[]{"104", "10000"}); 33 | MAge mock = (MAge) parser.parse(token); 34 | Assertions.assertNotNull(mock); 35 | Assertions.assertEquals(104, mock.getMin()); 36 | Assertions.assertEquals(10000, mock.getMax()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /benchmark/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.benchmark 15 | JMock :: Micro Benchmark 16 | jar 17 | 18 | 19 | 20 | cloud.xcan.jmock 21 | xcan-jmock.core 22 | ${project.version} 23 | 24 | 25 | 26 | cloud.xcan.jmock 27 | xcan-jmock.all-plugin 28 | ${project.version} 29 | 30 | 31 | 32 | org.openjdk.jmh 33 | jmh-core 34 | compile 35 | 36 | 37 | 38 | org.openjdk.jmh 39 | jmh-generator-annprocess 40 | compile 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /plugins/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.plugins 15 | JMock :: Plugins 16 | pom 17 | 18 | 19 | basic 20 | article 21 | date 22 | geography 23 | hash 24 | id 25 | locale 26 | network 27 | user 28 | web 29 | car 30 | code 31 | company 32 | crypto 33 | financial 34 | compute 35 | all 36 | 37 | 38 | 39 | 40 | cloud.xcan.jmock 41 | xcan-jmock.api 42 | 1.0.0 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/id/msnowid/MSnowIdMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.id.msnowid; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MSnowId; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MSnowIdMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MSnowId1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("SnowId", 18 | new String[]{}); 19 | MSnowId mock = (MSnowId) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(1, mock.getDcId()); 22 | Assertions.assertEquals(1, mock.getMId()); 23 | } 24 | 25 | /** 26 | * Full MockConstructor: @Float(min,max,scale,nullWeight) 27 | */ 28 | @Test 29 | public void MSnowId2() throws Exception { 30 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 31 | 32 | FunctionToken token = new FunctionToken("SnowId", 33 | new String[]{"4", "5"}); 34 | MSnowId mock = (MSnowId) parser.parse(token); 35 | Assertions.assertNotNull(mock); 36 | Assertions.assertEquals(4, mock.getDcId()); 37 | Assertions.assertEquals(5, mock.getMId()); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/mport/MPortMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.mport; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MPort; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MPortMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MPort1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Port", 18 | new String[]{}); 19 | MPort mock = (MPort) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(1024, mock.getMin()); 22 | Assertions.assertEquals(65535, mock.getMax()); 23 | } 24 | 25 | /** 26 | * Full MockConstructor: @Float(min,max,scale,nullWeight) 27 | */ 28 | @Test 29 | public void MPort2() throws Exception { 30 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 31 | 32 | FunctionToken token = new FunctionToken("Port", 33 | new String[]{"1200", "35000"}); 34 | MPort mock = (MPort) parser.parse(token); 35 | Assertions.assertNotNull(mock); 36 | Assertions.assertEquals(1200, mock.getMin()); 37 | Assertions.assertEquals(35000, mock.getMax()); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/basic/menum/MEnumMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.basic.menum; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MEnum; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MEnumMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MEnum_1() throws Exception { 15 | FunctionToken token = new FunctionToken("MEnum", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MEnum mock = (MEnum) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | } 20 | 21 | @Test 22 | public void MEnum_2() throws Exception { 23 | FunctionToken token = new FunctionToken("MEnum", new String[]{"DocGenerator|B"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MEnum mock = (MEnum) parser.parse(token); 26 | Assertions.assertNotNull(mock); 27 | } 28 | 29 | 30 | @Test 31 | public void MEnum_3() throws Exception { 32 | FunctionToken token = new FunctionToken("MEnum", new String[]{"DocGenerator|B", "1:2"}); 33 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 34 | MEnum mock = (MEnum) parser.parse(token); 35 | Assertions.assertNotNull(mock); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/hash/mmd5/MMd5MockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.hash.mmd5; 2 | 3 | 4 | import static cloud.xcan.jmock.api.support.utils.EncryptionUtils.MD5_16_LENGTH; 5 | import static cloud.xcan.jmock.api.support.utils.EncryptionUtils.MD5_32_LENGTH; 6 | 7 | import cloud.xcan.jmock.api.FunctionToken; 8 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 9 | import cloud.xcan.jmock.plugin.MMd5; 10 | import org.junit.jupiter.api.Assertions; 11 | import org.junit.jupiter.api.Test; 12 | 13 | public class MMd5MockConstructorTest { 14 | 15 | @Test 16 | public void MMd5() throws Exception { 17 | FunctionToken token = new FunctionToken("MMd5", new String[]{}); 18 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 19 | MMd5 mock = (MMd5) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(MD5_32_LENGTH, mock.getLength()); 22 | Assertions.assertEquals(32, mock.mock().length()); 23 | } 24 | 25 | @Test 26 | public void MMd5_1() throws Exception { 27 | FunctionToken token = new FunctionToken("MMd5", new String[]{"16"}); 28 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 29 | MMd5 mock = (MMd5) parser.parse(token); 30 | Assertions.assertNotNull(mock); 31 | Assertions.assertEquals(MD5_16_LENGTH, mock.getLength()); 32 | Assertions.assertEquals(16, mock.mock().length()); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /bom/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.bom 15 | JMock :: BOM 16 | pom 17 | Bill of Materials for jmock 18 | 19 | 20 | 21 | 22 | cloud.xcan.jmock 23 | xcan-jmock.api 24 | ${project.version} 25 | compile 26 | 27 | 28 | 29 | cloud.xcan.jmock 30 | xcan-jmock.core 31 | ${project.version} 32 | compile 33 | 34 | 35 | 36 | cloud.xcan.jmock 37 | xcan-jmock.plugins 38 | ${project.version} 39 | compile 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /plugins/financial/src/main/resources/i18n/jmock-financial-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.financial=Financial 2 | #--------------------------MAmount--------------------------- 3 | jmock.func.MAmount.description=Generate random amount 4 | jmock.func.MAmount.C1=Generate default localized amount for China 5 | jmock.func.MAmount.C2=Generate amount for specified locale 6 | #--------------------------MBudgetCategory--------------------------- 7 | jmock.func.MBudgetCategory.description=Generate budget category 8 | jmock.func.MBudgetCategory.C1=Generate default Chinese budget category 9 | jmock.func.MBudgetCategory.C2=Generate budget category in specified language 10 | #--------------------------MCurrency--------------------------- 11 | jmock.func.MCurrency.description=Generate currency 12 | jmock.func.MCurrency.C1=Generate default localized currency for China 13 | jmock.func.MCurrency.C2=Generate currency for specified locale 14 | #--------------------------MInvoiceNumber--------------------------- 15 | jmock.func.MInvoiceNumber.description=Generate invoice number 16 | jmock.func.MInvoiceNumber.C1=Generate default localized invoice number for China 17 | jmock.func.MInvoiceNumber.C2=Generate invoice number for specified locale 18 | #--------------------------MTaxCode--------------------------- 19 | jmock.func.MTaxCode.description=Generate tax code 20 | jmock.func.MTaxCode.C1=Generate default localized tax code for China 21 | jmock.func.MTaxCode.C2=Generate tax code for specified locale 22 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/MDrivetrain.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_CATEGORY_CAR; 4 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_DRIVETRAIN_C1; 5 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_DRIVETRAIN_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrand.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_DRIVETRAIN_DESC, categoryI18nKey = { 15 | DOC_CATEGORY_CAR}, order = 2002) 16 | public class MDrivetrain extends AbstractMockFunction { 17 | 18 | // List of drivetrain types 19 | public static final List DRIVETRAIN_TYPES = Arrays.asList( 20 | "FWD (Front-Wheel Drive)", "RWD (Rear-Wheel Drive)", "AWD (All-Wheel Drive)", 21 | "4WD (Four-Wheel Drive)", "Part-time 4WD", "Electric Drive" 22 | ); 23 | 24 | @JMockConstructor(descI18nKey = DOC_DRIVETRAIN_C1, 25 | example = "@Drivetrain()", 26 | exampleValues = {"AWD (All-Wheel Drive)", "RWD (Rear-Wheel Drive)", 27 | "FWD (Front-Wheel Drive)"}) 28 | public MDrivetrain() { 29 | } 30 | 31 | @Override 32 | public String mock() { 33 | return DRIVETRAIN_TYPES.get(random.nextInt(DRIVETRAIN_TYPES.size())); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/i18n/JMockMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.i18n; 2 | 3 | public interface JMockMessage { 4 | 5 | String PARSER_TEXT_IS_EMPTY = "jmock.parser.input.text.is.empty"; 6 | String PARSER_FUNC_PARAM_ILLEGAL = "jmock.parser.func.param.illegal"; 7 | String PARSER_PARAM_NOT_MATCH_WEIGHTS = "jmock.parser.parameters.not.match.weights"; 8 | String PARSER_EXPRESSION_ERROR_T = "jmock.parser.func.expression.identifierError.t"; 9 | String PARSER_CONSTRUCTOR_MISMATCH_T = "jmock.parser.func.constructor.mismatch.t"; 10 | 11 | String PARSER_FUNC_NAME_EMPTY = "jmock.parser.func.name.empty.t"; 12 | String PARSER_FUNC_NAME_INVALID = "jmock.parser.func.name.invalid.t"; 13 | String PARSER_FUNC_NAME_START_NOT_UPPERCASE = "jmock.parser.func.name.start.not.uppercase.t"; 14 | String PARSER_PARAMETER_NAME_INVALID = "jmock.parser.parameter.name.invalid.t"; 15 | 16 | String PARAM_START_NOT_FOUND_T = "jmock.func.param.startNotFound.t"; 17 | String PARAM_END_ERROR_T = "jmock.func.param.endError.t"; 18 | String PARAM_MAX_T = "jmock.func.param.max.t"; 19 | String PARAM_MIN_T = "jmock.func.param.min.t"; 20 | String PARAM_NOT_BLANK_T = "jmock.func.param.notBlank.t"; 21 | String PARAM_NOT_NULL_T = "jmock.func.param.notNull.t"; 22 | String PARAM_SIZE_T = "jmock.func.param.size.t"; 23 | String PARAM_LENGTH_T = "jmock.func.param.length.t"; 24 | String PARAM_WEIGHT_T = "jmock.func.param.weight.t"; 25 | String PARAM_UNACCEPTABLE_T = "jmock.func.param.unacceptable.t"; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/MEngine.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_CATEGORY_CAR; 4 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_ENGINE_C1; 5 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_ENGINE_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrand.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_ENGINE_DESC, categoryI18nKey = { 15 | DOC_CATEGORY_CAR}, order = 2003) 16 | public class MEngine extends AbstractMockFunction { 17 | 18 | // List of engine types 19 | public static final List ENGINE_TYPES = Arrays.asList( 20 | "1.5L I4 Turbo", "2.0L I4", "3.0L V6", "5.0L V8", 21 | "Electric Motor", "Hybrid (2.5L I4 + Electric)", "2.0L Diesel", 22 | "3.5L V6 Turbo", "2.4L Hybrid", "1.0L Turbo", "1.8L Hybrid", 23 | "2.2L Diesel", "4.0L V8", "2.5L Boxer", "3.3L V6" 24 | ); 25 | 26 | @JMockConstructor(descI18nKey = DOC_ENGINE_C1, 27 | example = "@Engine()", 28 | exampleValues = {"2.2L Diesel", "3.5L V6 Turbo", "1.5L I4 Turbo"}) 29 | public MEngine() { 30 | } 31 | 32 | @Override 33 | public String mock() { 34 | return ENGINE_TYPES.get(random.nextInt(ENGINE_TYPES.size())); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /plugins/car/src/main/resources/i18n/jmock-car-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.car=\u6C7D\u8F66 2 | #--------------------------MBrand------------------------------------ 3 | jmock.func.MBrand.description=\u751F\u6210\u6C7D\u8F66\u54C1\u724C 4 | jmock.func.MBrand.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u6C7D\u8F66\u54C1\u724C 5 | #--------------------------MDrivetrain------------------------------------ 6 | jmock.func.MDrivetrain.description=\u751F\u6210\u52A8\u529B\u7CFB\u7EDF 7 | jmock.func.MDrivetrain.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u52A8\u529B\u7CFB\u7EDF\u7C7B\u578B 8 | #--------------------------MEngine------------------------------------ 9 | jmock.func.MEngine.description=\u751F\u6210\u6C7D\u8F66\u5F15\u64CE 10 | jmock.func.MEngine.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u6C7D\u8F66\u5F15\u64CE\u7C7B\u578B 11 | #--------------------------MHorsepower------------------------------------ 12 | jmock.func.MHorsepower.description=\u751F\u6210\u6C7D\u8F66\u9A6C\u529B 13 | jmock.func.MHorsepower.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u6C7D\u8F66\u9A6C\u529B\u503C 14 | #--------------------------MPlate------------------------------------ 15 | jmock.func.MPlate.description=\u751F\u6210\u8F66\u724C\u53F7 16 | jmock.func.MPlate.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u8F66\u724C\u53F7 17 | #--------------------------MVehicle------------------------------------ 18 | jmock.func.MVehicle.description=\u751F\u6210\u8F66\u724C\u53F7 19 | jmock.func.MVehicle.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u8F66\u724C\u53F7 20 | -------------------------------------------------------------------------------- /plugins/code/src/main/resources/i18n/jmock-code-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.code=\u4EE3\u7801 2 | #--------------------------MCodeSnippet------------------------------------ 3 | jmock.func.MCodeSnippet.description=\u751F\u6210\u4EE3\u7801 4 | jmock.func.MCodeSnippet.parameter.language=\u7F16\u7A0B\u8BED\u8A00\uFF0C\u652F\u6301\u503C\uFF1APYTHON,JAVA,JAVASCRIPT,TYPESCRIPT,CPP,CSHARP,PHP,RUBY,SWIFT,GO 5 | jmock.func.MCodeSnippet.C1=\u751F\u6210JAVA\u4EE3\u7801\u7247\u6BB5 6 | jmock.func.MCodeSnippet.C2=\u751F\u6210\u6307\u5B9A\u7F16\u7A0B\u8BED\u8A00\u4EE3\u7801\u7247\u6BB5 7 | #--------------------------MErrorType------------------------------------ 8 | jmock.func.MErrorType.description=\u751F\u6210\u9519\u8BEF 9 | jmock.func.MErrorType.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u5F02\u5E38\u7C7B\u578B 10 | #--------------------------MHtml----------------------------------------- 11 | jmock.func.MHtml.description=\u751F\u6210Html\u5185\u5BB9 12 | jmock.func.MHtml.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673AHtml\u5185\u5BB9 13 | #--------------------------MMarkdown------------------------------------ 14 | jmock.func.MMarkdown.description=\u751F\u6210Markdown\u5185\u5BB9 15 | jmock.func.MMarkdown.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673AMarkdown\u5185\u5BB9 16 | #--------------------------MProgrammingLanguage--------------------------- 17 | jmock.func.MProgrammingLanguage.description=\u751F\u6210\u7F16\u7A0B\u8BED\u8A00 18 | jmock.func.MProgrammingLanguage.C1=\u751F\u6210\u9ED8\u8BA4\u968F\u673A\u7F16\u7A0B\u8BED\u8A00 19 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/exception/ParamParseException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.exception; 2 | 3 | 4 | import cloud.xcan.jmock.api.i18n.MessageResources; 5 | import cloud.xcan.jmock.api.i18n.ThreadLocaleHolder; 6 | 7 | public class ParamParseException extends AbstractParseException { 8 | 9 | private final String messageKey; 10 | private final Object[] params; 11 | 12 | public ParamParseException(String messageKey) { 13 | this(messageKey, null); 14 | } 15 | 16 | public ParamParseException(String messageKey, Object[] params) { 17 | super(-1); 18 | this.messageKey = messageKey; 19 | this.params = params; 20 | } 21 | 22 | public static ParamParseException of(String messageKey) { 23 | return new ParamParseException(messageKey); 24 | } 25 | 26 | public static ParamParseException of(String messageKey, Object[] params) { 27 | return new ParamParseException(messageKey, params); 28 | } 29 | 30 | public static void throw0(String messageKey) { 31 | throw of(messageKey); 32 | } 33 | 34 | public static void throw0(String messageKey, Object[] params) { 35 | throw of(messageKey, params); 36 | } 37 | 38 | @Override 39 | public String getMessage() { 40 | if (params == null) { 41 | return MessageResources.getString(messageKey, ThreadLocaleHolder.getLocale()); 42 | } 43 | return MessageResources.getString(messageKey, params, ThreadLocaleHolder.getLocale()); 44 | } 45 | 46 | public String getMessageKey() { 47 | return messageKey; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.core 15 | JMock :: Core 16 | jar 17 | 18 | 19 | 20 | cloud.xcan.jmock 21 | xcan-jmock.api 22 | ${project.version} 23 | 24 | 25 | 26 | cloud.xcan.jmock 27 | xcan-jmock.all-plugin 28 | ${project.version} 29 | 30 | 31 | 32 | 33 | 34 | 35 | org.apache.maven.plugins 36 | maven-compiler-plugin 37 | 38 | 39 | 40 | -parameters 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /plugins/company/src/main/java/cloud/xcan/jmock/plugin/CompanyDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class CompanyDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 40xx. 10 | */ 11 | public final static String DOC_CATEGORY_COMPANY = "jmock.func.category.company"; 12 | 13 | public final static String DOC_COMPANY_DESC = "jmock.func.MCompany.description"; 14 | public final static String DOC_COMPANY_C1 = "jmock.func.MCompany.C1"; 15 | public final static String DOC_COMPANY_C2 = "jmock.func.MCompany.C2"; 16 | 17 | public final static String DOC_DEPARTMENT_DESC = "jmock.func.MDepartment.description"; 18 | public final static String DOC_DEPARTMENT_C1 = "jmock.func.MDepartment.C1"; 19 | public final static String DOC_DEPARTMENT_C2 = "jmock.func.MDepartment.C2"; 20 | 21 | public final static String DOC_INDUSTRY_DESC = "jmock.func.MIndustry.description"; 22 | public final static String DOC_INDUSTRY_C1 = "jmock.func.MIndustry.C1"; 23 | public final static String DOC_INDUSTRY_C2 = "jmock.func.MIndustry.C2"; 24 | 25 | public final static String DOC_JOB_DESC = "jmock.func.MJob.description"; 26 | public final static String DOC_JOB_C1 = "jmock.func.MJob.C1"; 27 | public final static String DOC_JOB_C2 = "jmock.func.MJob.C2"; 28 | 29 | 30 | @Override 31 | public void register() { 32 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-company-plugin-messages"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/CarDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class CarDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 20xx. 10 | */ 11 | public final static String DOC_CATEGORY_CAR = "jmock.func.category.car"; 12 | 13 | public final static String DOC_BRAND_DESC = "jmock.func.MBrand.description"; 14 | public final static String DOC_BRAND_C1 = "jmock.func.MBrand.C1"; 15 | 16 | public final static String DOC_DRIVETRAIN_DESC = "jmock.func.MDrivetrain.description"; 17 | public final static String DOC_DRIVETRAIN_C1 = "jmock.func.MDrivetrain.C1"; 18 | 19 | public final static String DOC_ENGINE_DESC = "jmock.func.MEngine.description"; 20 | public final static String DOC_ENGINE_C1 = "jmock.func.MEngine.C1"; 21 | 22 | public final static String DOC_HORSEPOWER_DESC = "jmock.func.MHorsepower.description"; 23 | public final static String DOC_HORSEPOWER_C1 = "jmock.func.MHorsepower.C1"; 24 | 25 | public final static String DOC_PLATE_DESC = "jmock.func.MPlate.description"; 26 | public final static String DOC_PLATE_C1 = "jmock.func.MPlate.C1"; 27 | 28 | public final static String DOC_VEHICLE_DESC = "jmock.func.MVehicle.description"; 29 | public final static String DOC_VEHICLE_C1 = "jmock.func.MVehicle.C1"; 30 | 31 | @Override 32 | public void register() { 33 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-car-plugin-messages"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /plugins/code/src/main/java/cloud/xcan/jmock/plugin/MErrorType.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | 4 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_CATEGORY_CODE; 5 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_ERROR_TYPE_C1; 6 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_ERROR_TYPE_DESC; 7 | import static cloud.xcan.jmock.plugin.MCodeSnippet.random; 8 | 9 | import cloud.xcan.jmock.api.AbstractMockFunction; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | @JMockFunctionRegister(descI18nKey = DOC_ERROR_TYPE_DESC, categoryI18nKey = { 16 | DOC_CATEGORY_CODE}, order = 3002) 17 | public class MErrorType extends AbstractMockFunction { 18 | 19 | public static final List ERROR_TYPES = Arrays.asList( 20 | "NullPointerException", "IllegalArgumentException", "IndexOutOfBoundsException", 21 | "TypeError", "ReferenceError", "SyntaxError", "RuntimeError", 22 | "FileNotFoundError", "NetworkError", "TimeoutError", "ValidationError", 23 | "DatabaseError", "AuthenticationError", "AuthorizationError" 24 | ); 25 | 26 | @JMockConstructor(descI18nKey = DOC_ERROR_TYPE_C1, 27 | example = "@ErrorType()", 28 | exampleValues = {"ReferenceError", "IndexOutOfBoundsException"}) 29 | public MErrorType() { 30 | } 31 | 32 | @Override 33 | public String mock() { 34 | return ERROR_TYPES.get(random.nextInt(ERROR_TYPES.size())); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /plugins/id/src/main/resources/i18n/jmock-id-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.id=ID Generation 2 | #--------------------------MGuid------------------------------------ 3 | jmock.func.MGuid.description=Generate GUID-based IDs 4 | jmock.func.MGuid.parameter.withoutSeparator=Include separators ("-"), default true 5 | jmock.func.MGuid.C1=Generate GUID without separators 6 | jmock.func.MGuid.C2=Generate GUID with separators 7 | #--------------------------MUuid------------------------------------ 8 | jmock.func.MUuid.description=Generate UUID-based IDs 9 | jmock.func.MUuid.parameter.withoutSeparator=Include separators ("-"), default true 10 | jmock.func.MUuid.C1=Generate UUID without separators 11 | jmock.func.MUuid.C2=Generate UUID with separators 12 | #--------------------------MSnowId------------------------------------ 13 | jmock.func.MSnowId.description=Generate Snowflake-based IDs (distributed unique) 14 | jmock.func.MSnowId.parameter.dcId=Datacenter ID, default 1 15 | jmock.func.MSnowId.parameter.mId=Machine ID, default 1 16 | jmock.func.MSnowId.C1=Generate Snowflake ID (dcId=1, mId=1) 17 | jmock.func.MSnowId.C2=Generate Snowflake ID with specified dcId and mId 18 | #--------------------------MIncId------------------------------------ 19 | jmock.func.MIncId.description=Generate incremental IDs (node-unique) 20 | jmock.func.MIncId.parameter.init=Initial value, default 1 21 | jmock.func.MIncId.parameter.step=Increment step, default 1 22 | jmock.func.MIncId.C1=Generate incremental ID (start=1, step=1) 23 | jmock.func.MIncId.C2=Generate incremental ID with specified start and step 24 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mname/MNameMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mname; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MName; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MNameMockTest { 9 | 10 | 11 | @Test 12 | public void case1_defaultTest() throws Exception { 13 | FunctionToken token = new FunctionToken("MName", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MName mock = (MName) parser.parse(token); 16 | for (int i = 0; i < 10; i++) { 17 | String str = mock.mock(); 18 | System.out.println("str = " + str); 19 | } 20 | } 21 | 22 | @Test 23 | public void case2() throws Exception { 24 | FunctionToken token = new FunctionToken("MName", new String[]{"张三|李四"}); 25 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 26 | MName mock = (MName) parser.parse(token); 27 | for (int i = 0; i < 10; i++) { 28 | String str = mock.mock(); 29 | System.out.println(str); 30 | } 31 | } 32 | 33 | @Test 34 | public void case3() throws Exception { 35 | FunctionToken token = new FunctionToken("MName", new String[]{"en"}); 36 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 37 | MName mock = (MName) parser.parse(token); 38 | for (int i = 0; i < 10; i++) { 39 | String str = mock.mock(); 40 | System.out.println(str); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/MVehicle.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_CATEGORY_CAR; 4 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_VEHICLE_C1; 5 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_VEHICLE_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrand.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_VEHICLE_DESC, categoryI18nKey = { 15 | DOC_CATEGORY_CAR}, order = 2006) 16 | public class MVehicle extends AbstractMockFunction { 17 | 18 | public static final List VEHICLE_TYPES = Arrays.asList( 19 | "Sedan", "SUV", "Truck", "Hatchback", "Coupe", 20 | "Convertible", "Minivan", "Crossover", "Sports Car", "Electric Vehicle", 21 | "Station Wagon", "Pickup Truck", "Compact Car", "Luxury Car", "Hybrid Vehicle" 22 | ); 23 | 24 | @JMockConstructor(descI18nKey = DOC_VEHICLE_C1, 25 | example = "@Vehicle()", 26 | exampleValues = {"Coupe", "SUV", "Station Wagon"}) 27 | public MVehicle() { 28 | } 29 | 30 | public static void main(String[] args) { 31 | for (int i = 0; i < 3; i++) { 32 | System.out.println(new MVehicle().mock()); 33 | } 34 | } 35 | 36 | @Override 37 | public String mock() { 38 | return VEHICLE_TYPES.get(random.nextInt(VEHICLE_TYPES.size())); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/TokenException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | 4 | import cloud.xcan.jmock.api.exception.AbstractParseException; 5 | 6 | public class TokenException extends AbstractParseException { 7 | 8 | protected String name; 9 | 10 | /** 11 | * Construct a new text or expression parse exception. 12 | * 13 | * @param name Exception extractor name 14 | */ 15 | public TokenException(String name) { 16 | this(name, -1); 17 | } 18 | 19 | /** 20 | * Construct a new text or expression parse exception. 21 | * 22 | * @param name Exception extractor name 23 | * @param position The position in the text or expression where the problem occurred. 24 | */ 25 | public TokenException(String name, int position) { 26 | super(position + 1); 27 | this.name = unEscapeString(name); 28 | } 29 | 30 | /** 31 | * Return the exception locale message. 32 | */ 33 | @Override 34 | public String getMessage() { 35 | return ""; 36 | } 37 | 38 | public String unEscapeString(String s) { 39 | StringBuilder sb = new StringBuilder(); 40 | for (int i = 0; i < s.length(); i++) { 41 | switch (s.charAt(i)) { 42 | case '\n': 43 | sb.append("\\n"); 44 | break; 45 | case '\t': 46 | sb.append("\\t"); 47 | break; 48 | // ... rest of escape characters 49 | default: 50 | sb.append(s.charAt(i)); 51 | } 52 | } 53 | return sb.toString(); 54 | } 55 | 56 | public String getName() { 57 | return name; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/date/mlocaleTime/MLocaleTimeMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.date.mlocaleTime; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLocaleTime; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLocaleTimeMockConstructorTest { 11 | 12 | /** 13 | * No-parameter MockConstructor: @String() 14 | */ 15 | @Test 16 | public void MLocaleTime1() throws Exception { 17 | FunctionToken token = new FunctionToken("MLocaleTime", new String[]{}); 18 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 19 | MLocaleTime mock = (MLocaleTime) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | } 22 | 23 | @Test 24 | public void MLocaleTime2() throws Exception { 25 | FunctionToken token = new FunctionToken("MLocaleTime", new String[]{"yy-MM-dd"}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MLocaleTime mock = (MLocaleTime) parser.parse(token); 28 | Assertions.assertNotNull(mock); 29 | } 30 | 31 | @Test 32 | public void MLocaleTime3() throws Exception { 33 | FunctionToken token = new FunctionToken("MLocaleTime", 34 | new String[]{"HH:mm:ss", "Asia/Tokyo", "true"}); 35 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | MLocaleTime mock = (MLocaleTime) parser.parse(token); 37 | Assertions.assertNotNull(mock); 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mcity/MCityMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mcity; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MCity; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MCityMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MCity1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("City", 18 | new String[]{}); 19 | MCity mock = (MCity) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertNotNull(mock.getDictArray()); 22 | } 23 | 24 | @Test 25 | public void MCity2() throws Exception { 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | 28 | FunctionToken token = new FunctionToken("City", 29 | new String[]{"en"}); 30 | MCity mock = (MCity) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | Assertions.assertNotNull(mock.getDictArray()); 33 | } 34 | 35 | @Test 36 | public void MCity3() throws Exception { 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | 39 | FunctionToken token = new FunctionToken("City", 40 | new String[]{"等我|耳机|佛山"}); 41 | MCity mock = (MCity) parser.parse(token); 42 | Assertions.assertNotNull(mock); 43 | Assertions.assertNotNull(mock.getDictArray()); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /plugins/code/src/main/java/cloud/xcan/jmock/plugin/MProgrammingLanguage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_CATEGORY_CODE; 4 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_PROGRAMMING_LANGUAGE_C1; 5 | import static cloud.xcan.jmock.plugin.CodeDocMessage.DOC_PROGRAMMING_LANGUAGE_DESC; 6 | import static cloud.xcan.jmock.plugin.MCodeSnippet.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_PROGRAMMING_LANGUAGE_DESC, categoryI18nKey = { 15 | DOC_CATEGORY_CODE}, order = 3005) 16 | public class MProgrammingLanguage extends AbstractMockFunction { 17 | 18 | public static final List PROGRAMMING_LANGUAGES = Arrays.asList( 19 | "Python", "JavaScript", "Java", "C++", "C#", "TypeScript", "Go", "Rust", 20 | "Swift", "Kotlin", "PHP", "Ruby", "Scala", "Dart", "Elixir", "Clojure" 21 | ); 22 | 23 | @JMockConstructor(descI18nKey = DOC_PROGRAMMING_LANGUAGE_C1, 24 | example = "@ProgrammingLanguage()", 25 | exampleValues = {"Kotlin", "Scala", "JavaScript"}) 26 | public MProgrammingLanguage() { 27 | } 28 | 29 | @Override 30 | public String mock() { 31 | return generateRandomProgrammingLanguage(); 32 | } 33 | 34 | public static String generateRandomProgrammingLanguage() { 35 | return PROGRAMMING_LANGUAGES.get(random.nextInt(PROGRAMMING_LANGUAGES.size())); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mgender/MGenderMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mgender; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MGender; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MGenderMockTest { 9 | 10 | @Test 11 | public void case1() throws Exception { 12 | FunctionToken token = new FunctionToken("MGender", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MGender mock = (MGender) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String value = mock.mock(); 17 | System.out.println("value = " + value); 18 | } 19 | } 20 | 21 | @Test 22 | public void case2() throws Exception { 23 | FunctionToken token = new FunctionToken("MGender", new String[]{"en"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MGender mock = (MGender) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String value = mock.mock(); 28 | System.out.println("value = " + value); 29 | } 30 | } 31 | 32 | @Test 33 | public void case3() throws Exception { 34 | FunctionToken token = new FunctionToken("MGender", new String[]{"F|M"}); 35 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | MGender mock = (MGender) parser.parse(token); 37 | for (int i = 0; i < 10; i++) { 38 | String value = mock.mock(); 39 | System.out.println("value = " + value); 40 | } 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /plugins/compute/src/main/java/cloud/xcan/jmock/plugin/MRam.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_CATEGORY_COMPUTE; 4 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_RAM_C1; 5 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_RAM_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrowser.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_RAM_DESC, 15 | categoryI18nKey = {DOC_CATEGORY_COMPUTE}, order = 5004) 16 | public class MRam extends AbstractMockFunction { 17 | 18 | public static final List RAM_SIZES = Arrays.asList(4, 8, 16, 32, 64, 128); 19 | public static final List RAM_TYPES = Arrays.asList("DDR4", "DDR5", "LPDDR4X", "LPDDR5"); 20 | public static final List RAM_SPEEDS = Arrays.asList(2400, 2666, 2933, 3200, 3600, 4800, 21 | 5200, 5600); 22 | 23 | @JMockConstructor(descI18nKey = DOC_RAM_C1, 24 | example = "@Ram()", 25 | exampleValues = {"128GB DDR5 2933MHz", "32GB DDR4 5600MHz"}) 26 | public MRam() { 27 | } 28 | 29 | @Override 30 | public String mock() { 31 | int size = RAM_SIZES.get(random.nextInt(RAM_SIZES.size())); 32 | String type = RAM_TYPES.get(random.nextInt(RAM_TYPES.size())); 33 | int speed = RAM_SPEEDS.get(random.nextInt(RAM_SPEEDS.size())); 34 | 35 | return size + "GB " + type + " " + speed + "MHz"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /plugins/code/src/main/java/cloud/xcan/jmock/plugin/CodeDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class CodeDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 30xx. 10 | */ 11 | public final static String DOC_CATEGORY_CODE = "jmock.func.category.code"; 12 | 13 | public final static String DOC_CODE_SNIPPET_DESC = "jmock.func.MCodeSnippet.description"; 14 | public final static String DOC_CODE_PARAMETER_LANGUAGE = "jmock.func.MCodeSnippet.parameter.language"; 15 | public final static String DOC_CODE_SNIPPET_C1 = "jmock.func.MCodeSnippet.C1"; 16 | public final static String DOC_CODE_SNIPPET_C2 = "jmock.func.MCodeSnippet.C2"; 17 | 18 | public final static String DOC_ERROR_TYPE_DESC = "jmock.func.MErrorType.description"; 19 | public final static String DOC_ERROR_TYPE_C1 = "jmock.func.MErrorType.C1"; 20 | 21 | public final static String DOC_HTML_DESC = "jmock.func.MHtml.description"; 22 | public final static String DOC_HTML_C1 = "jmock.func.MHtml.C1"; 23 | 24 | public final static String DOC_MARKDOWN_DESC = "jmock.func.MMarkdown.description"; 25 | public final static String DOC_MARKDOWN_C1 = "jmock.func.MMarkdown.C1"; 26 | 27 | public final static String DOC_PROGRAMMING_LANGUAGE_DESC = "jmock.func.MProgrammingLanguage.description"; 28 | public final static String DOC_PROGRAMMING_LANGUAGE_C1 = "jmock.func.MProgrammingLanguage.C1"; 29 | 30 | @Override 31 | public void register() { 32 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-code-plugin-messages"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mlatitude/MLatitudeMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mlatitude; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLatitude; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLatitudeMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MLatitude1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | FunctionToken token = new FunctionToken("Latitude", 17 | new String[]{}); 18 | MLatitude mock = (MLatitude) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | Assertions.assertEquals(-90, mock.getMinLat()); 21 | Assertions.assertEquals(90, mock.getMaxLat()); 22 | Assertions.assertEquals("0.000000", mock.getScalePattern()); 23 | Assertions.assertEquals(0.0, mock.getNullWeight()); 24 | } 25 | 26 | @Test 27 | public void MLatitude2() throws Exception { 28 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 29 | FunctionToken token = new FunctionToken("Latitude", 30 | new String[]{"-80D", "75D", "3", "2:8"}); 31 | MLatitude mock = (MLatitude) parser.parse(token); 32 | Assertions.assertNotNull(mock); 33 | Assertions.assertEquals(-80, mock.getMinLat()); 34 | Assertions.assertEquals(75, mock.getMaxLat()); 35 | Assertions.assertEquals("0.000", mock.getScalePattern()); 36 | Assertions.assertEquals(0.2, mock.getNullWeight()); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/memail/MEmailMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.memail; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MEmail; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MEmailMockTest { 9 | 10 | @Test 11 | public void email() throws Exception { 12 | FunctionToken token = new FunctionToken("MEmail", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MEmail mock = (MEmail) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String value = mock.mock(); 17 | System.out.println("value = " + value); 18 | } 19 | } 20 | 21 | @Test 22 | public void email1() throws Exception { 23 | FunctionToken token = new FunctionToken("MEmail", new String[]{"1", "2000"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MEmail mock = (MEmail) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String value = mock.mock(); 28 | System.out.println("value = " + value); 29 | } 30 | } 31 | 32 | @Test 33 | public void email2() throws Exception { 34 | FunctionToken token = new FunctionToken("MEmail", new String[]{"1", "20", "qq.com|wx.com"}); 35 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | MEmail mock = (MEmail) parser.parse(token); 37 | for (int i = 0; i < 10; i++) { 38 | String value = mock.mock(); 39 | System.out.println("value = " + value); 40 | } 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/mip/MIpMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.mip; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MIPv4; 6 | import cloud.xcan.jmock.plugin.MIPv6; 7 | import cloud.xcan.jmock.plugin.MMac; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MIpMockTest { 11 | 12 | @Test 13 | public void ipv4() throws Exception { 14 | FunctionToken token = new FunctionToken("IPv4", new String[]{}); 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | MIPv4 mock = (MIPv4) parser.parse(token); 17 | for (int i = 0; i < 10; i++) { 18 | String ipv4 = mock.mock(); 19 | System.out.println("ipv4 = " + ipv4); 20 | } 21 | } 22 | 23 | @Test 24 | public void ipv6() throws Exception { 25 | FunctionToken token = new FunctionToken("IPv6", new String[]{}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MIPv6 mock = (MIPv6) parser.parse(token); 28 | for (int i = 0; i < 10; i++) { 29 | String ipv6 = mock.mock(); 30 | System.out.println("ipv6 = " + ipv6); 31 | } 32 | } 33 | 34 | @Test 35 | public void mac() throws Exception { 36 | FunctionToken token = new FunctionToken("MMac", new String[]{}); 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | MMac mock = (MMac) parser.parse(token); 39 | for (int i = 0; i < 10; i++) { 40 | String mac = mock.mock(); 41 | System.out.println("mac = " + mac); 42 | } 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mlongitude/MLongitudeMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mlongitude; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLongitude; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLongitudeMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MLongitude1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | FunctionToken token = new FunctionToken("Longitude", 17 | new String[]{}); 18 | MLongitude mock = (MLongitude) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | Assertions.assertEquals(-180, mock.getMinLng()); 21 | Assertions.assertEquals(180, mock.getMaxLng()); 22 | Assertions.assertEquals("0.000000", mock.getScalePattern()); 23 | Assertions.assertEquals(0.0D, mock.getNullWeight()); 24 | } 25 | 26 | @Test 27 | public void MLongitude2() throws Exception { 28 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 29 | FunctionToken token = new FunctionToken("Longitude", 30 | new String[]{"-176D", "60D", "3", "2:8"}); 31 | MLongitude mock = (MLongitude) parser.parse(token); 32 | Assertions.assertNotNull(mock); 33 | Assertions.assertEquals(-176, mock.getMinLng()); 34 | Assertions.assertEquals(60, mock.getMaxLng()); 35 | Assertions.assertEquals("0.000", mock.getScalePattern()); 36 | Assertions.assertEquals(0.2D, mock.getNullWeight()); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /core/src/main/java/cloud/xcan/jmock/core/exception/FunctionStartException.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.exception; 2 | 3 | import static cloud.xcan.jmock.api.i18n.JMockMessage.PARAM_START_NOT_FOUND_T; 4 | import static cloud.xcan.jmock.api.i18n.JMockMessage.PARSER_EXPRESSION_ERROR_T; 5 | import static cloud.xcan.jmock.api.i18n.ThreadLocaleHolder.getLocale; 6 | 7 | import cloud.xcan.jmock.api.i18n.MessageResources; 8 | 9 | public class FunctionStartException extends ExpressionTokenException { 10 | 11 | private final String messageKey; 12 | private final char functionIdentifier; 13 | 14 | public FunctionStartException(String name, int position, char functionIdentifier, 15 | String messageKey) { 16 | super(name, position); 17 | this.functionIdentifier = functionIdentifier; 18 | this.messageKey = messageKey; 19 | } 20 | 21 | public static FunctionStartException of(String name, int position) { 22 | return new FunctionStartException(name, position, '\0', PARAM_START_NOT_FOUND_T); 23 | } 24 | 25 | public static FunctionStartException of(char functionIdentifier, int position) { 26 | return new FunctionStartException("", position, functionIdentifier, PARSER_EXPRESSION_ERROR_T); 27 | } 28 | 29 | @Override 30 | public String getMessage() { 31 | if (messageKey.equals(PARAM_START_NOT_FOUND_T)) { 32 | return MessageResources.getString(messageKey, new Object[]{name, position}, getLocale()); 33 | } else { 34 | return MessageResources.getString(messageKey, new Object[]{functionIdentifier, position 35 | }, getLocale()); 36 | } 37 | } 38 | 39 | public String getMessageKey() { 40 | return messageKey; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/basic/menum/MEnumMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.basic.menum; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MEnum; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MEnumMockTest { 9 | 10 | @Test 11 | public void case1_defaultTest() throws Exception { 12 | FunctionToken token = new FunctionToken("MEnum", new String[]{"DocGenerator|B"}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MEnum mock = (MEnum) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String str = mock.mock(); 17 | System.out.println("str = " + str); 18 | } 19 | } 20 | 21 | @Test 22 | public void case2() throws Exception { 23 | FunctionToken token = new FunctionToken("MEnum", new String[]{"DocGenerator|B", "2:1"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MEnum mock = (MEnum) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String str = mock.mock(); 28 | System.out.println("str = " + str); 29 | } 30 | } 31 | 32 | @Test 33 | public void case3() throws Exception { 34 | FunctionToken token = new FunctionToken("MEnum", 35 | new String[]{"DocGenerator|B|C", "1:2:3", "1:9"}); 36 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 37 | MEnum mock = (MEnum) parser.parse(token); 38 | for (int i = 0; i < 10; i++) { 39 | String str = mock.mock(); 40 | System.out.println("str = " + str); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/basic/mregexp/MRegExpMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.basic.mregexp; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MRegExp; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MRegExpMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MRegExp() throws Exception { 15 | FunctionToken token = new FunctionToken("MRegExp", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MRegExp mock = (MRegExp) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | Assertions.assertNull(mock.getRegexp()); 20 | 21 | } 22 | 23 | @Test 24 | public void MRegExp_1() throws Exception { 25 | FunctionToken token = new FunctionToken("MRegExp", new String[]{"[0-9]"}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MRegExp mock = (MRegExp) parser.parse(token); 28 | Assertions.assertNotNull(mock); 29 | Assertions.assertEquals("[0-9]", mock.getRegexp()); 30 | } 31 | 32 | @Test 33 | public void MRegExp_2() throws Exception { 34 | FunctionToken token = new FunctionToken("MRegExp", new String[]{"[0-9]", "1:1"}); 35 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | MRegExp mock = (MRegExp) parser.parse(token); 37 | Assertions.assertNotNull(mock); 38 | Assertions.assertEquals("[0-9]", mock.getRegexp()); 39 | Assertions.assertEquals(0.5, mock.getNullWeight(), 1); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/mfirstname/MFirstNameMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.mfirstname; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MFirstname; 7 | import java.util.List; 8 | import org.junit.jupiter.api.Assertions; 9 | import org.junit.jupiter.api.Test; 10 | 11 | public class MFirstNameMockConstructorTest { 12 | 13 | @Test 14 | public void MFirstname() throws Exception { 15 | FunctionToken token = new FunctionToken("MFirstname", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MFirstname mock = (MFirstname) parser.parse(token); 18 | Assertions.assertNotNull(mock); 19 | Assertions.assertNotNull(mock.mock()); 20 | } 21 | 22 | @Test 23 | public void MFirstname_1() throws Exception { 24 | FunctionToken token = new FunctionToken("MFirstname", new String[]{"James|Jordon"}); 25 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 26 | MFirstname mock = (MFirstname) parser.parse(token); 27 | Assertions.assertNotNull(mock); 28 | Assertions.assertTrue(List.of("James", "Jordon").contains(mock.mock())); 29 | } 30 | 31 | @Test 32 | public void MFirstname2() throws Exception { 33 | FunctionToken token = new FunctionToken("MFirstname", new String[]{}); 34 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 35 | MFirstname mock = (MFirstname) parser.parse(token); 36 | Assertions.assertNotNull(mock); 37 | Assertions.assertNotNull(mock.mock()); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /plugins/financial/src/main/resources/i18n/jmock-financial-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.financial=\u8D22\u52A1 2 | #--------------------------MAmount--------------------------- 3 | jmock.func.MAmount.description=\u751F\u6210\u968F\u673A\u91D1\u989D 4 | jmock.func.MAmount.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u56FD\u672C\u5730\u5316\u91D1\u989D\u503C 5 | jmock.func.MAmount.C2=\u751F\u6210\u6307\u5B9A\u533A\u57DF\u91D1\u989D\u503C 6 | #--------------------------MBudgetCategory--------------------------- 7 | jmock.func.MBudgetCategory.description=\u751F\u6210\u9884\u7B97\u5206\u7C7B 8 | jmock.func.MBudgetCategory.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u6587\u9884\u7B97\u5206\u7C7B 9 | jmock.func.MBudgetCategory.C2=\u751F\u6210\u6307\u5B9A\u8BED\u8A00\u9884\u7B97\u5206\u7C7B 10 | #--------------------------MCurrency--------------------------- 11 | jmock.func.MCurrency.description=\u751F\u6210\u8D27\u5E01 12 | jmock.func.MCurrency.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u56FD\u672C\u5730\u5316\u8D27\u5E01 13 | jmock.func.MCurrency.C2=\u751F\u6210\u6307\u5B9A\u533A\u57DF\u8D27\u5E01 14 | #--------------------------MInvoiceNumber--------------------------- 15 | jmock.func.MInvoiceNumber.description=\u751F\u6210\u53D1\u7968\u7F16\u53F7 16 | jmock.func.MInvoiceNumber.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u56FD\u672C\u5730\u5316\u53D1\u7968\u7F16\u53F7 17 | jmock.func.MInvoiceNumber.C2=\u751F\u6210\u6307\u5B9A\u533A\u57DF\u53D1\u7968\u7F16\u53F7 18 | #--------------------------MTaxCode--------------------------- 19 | jmock.func.MTaxCode.description=\u751F\u6210\u7A0E\u7801 20 | jmock.func.MTaxCode.C1=\u751F\u6210\u9ED8\u8BA4\u4E2D\u56FD\u672C\u5730\u5316\u7A0E\u7801 21 | jmock.func.MTaxCode.C2=\u751F\u6210\u6307\u5B9A\u533A\u57DF\u7A0E\u7801 22 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/maddress/MAddressMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.maddress; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MAddress; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MAddressMockTest { 9 | 10 | /** 11 | * No-parameter MockConstructor: @Address() 12 | */ 13 | @Test 14 | public void MAddress1() throws Exception { 15 | FunctionToken token = new FunctionToken("Address", new String[]{}); 16 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 17 | MAddress mock = (MAddress) parser.parse(token); 18 | for (int i = 0; i < 10; i++) { 19 | String l1 = mock.mock(); 20 | System.out.println("l1 = " + l1); 21 | } 22 | } 23 | 24 | @Test 25 | public void MAddress2() throws Exception { 26 | FunctionToken token = new FunctionToken("Address", new String[]{"en"}); 27 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 28 | MAddress mock = (MAddress) parser.parse(token); 29 | for (int i = 0; i < 10; i++) { 30 | String l1 = mock.mock(); 31 | System.out.println("l1 = " + l1); 32 | } 33 | } 34 | 35 | @Test 36 | public void MAddress3() throws Exception { 37 | FunctionToken token = new FunctionToken("Address", new String[]{"123|4537"}); 38 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 39 | MAddress mock = (MAddress) parser.parse(token); 40 | for (int i = 0; i < 10; i++) { 41 | String l1 = mock.mock(); 42 | System.out.println("l1 = " + l1); 43 | } 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/code/CodeDataGeneratorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.code; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertNotNull; 4 | import static org.junit.jupiter.api.Assertions.assertTrue; 5 | 6 | import cloud.xcan.jmock.plugin.MErrorType; 7 | import cloud.xcan.jmock.plugin.MProgrammingLanguage; 8 | import java.util.HashSet; 9 | import java.util.Set; 10 | import org.junit.jupiter.api.RepeatedTest; 11 | import org.junit.jupiter.api.Test; 12 | 13 | class CodeDataGeneratorTest { 14 | 15 | @RepeatedTest(20) 16 | void testGenerateRandomProgrammingLanguage() { 17 | String language = new MProgrammingLanguage().mock(); 18 | assertNotNull(language); 19 | assertTrue(language.length() >= 2); 20 | assertTrue(MProgrammingLanguage.PROGRAMMING_LANGUAGES.contains(language)); 21 | } 22 | 23 | @Test 24 | void testLanguageCoverage() { 25 | Set languages = new HashSet<>(); 26 | for (int i = 0; i < 50; i++) { 27 | languages.add(new MProgrammingLanguage().mock()); 28 | } 29 | assertTrue(languages.size() >= 10, "Should cover multiple languages"); 30 | } 31 | 32 | @RepeatedTest(20) 33 | void testGenerateRandomErrorType() { 34 | String error = new MErrorType().mock(); 35 | assertNotNull(error); 36 | assertTrue(error.endsWith("Error") || error.endsWith("Exception")); 37 | assertTrue(MErrorType.ERROR_TYPES.contains(error)); 38 | } 39 | 40 | @Test 41 | void testErrorTypeCoverage() { 42 | Set errors = new HashSet<>(); 43 | for (int i = 0; i < 50; i++) { 44 | errors.add(new MErrorType().mock()); 45 | } 46 | assertTrue(errors.size() >= 8, "Should cover multiple error types"); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/date/mlocaledate/MLocaleDateMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.date.mlocaledate; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLocaleDate; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLocaleDateMockConstructorTest { 11 | 12 | /** 13 | * No-parameter MockConstructor: @String() 14 | */ 15 | @Test 16 | public void MLocaleDate1() throws Exception { 17 | FunctionToken token = new FunctionToken("MLocaleDate", new String[]{}); 18 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 19 | MLocaleDate mock = (MLocaleDate) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | } 22 | 23 | /** 24 | * Basic MockConstructor: @String(length) 25 | */ 26 | @Test 27 | public void MLocaleDate2() throws Exception { 28 | FunctionToken token = new FunctionToken("MLocaleDate", new String[]{"yy-MM-dd"}); 29 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 30 | MLocaleDate mock = (MLocaleDate) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | } 33 | 34 | @Test 35 | public void MLocaleDate3() throws Exception { 36 | FunctionToken token = new FunctionToken("MLocaleDate", 37 | new String[]{"yy-MM-dd", "America/Argentina/Buenos_Aires", "true"}); 38 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 39 | MLocaleDate mock = (MLocaleDate) parser.parse(token); 40 | Assertions.assertNotNull(mock); 41 | System.out.println(mock.mock()); 42 | } 43 | 44 | 45 | } 46 | -------------------------------------------------------------------------------- /test/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 4.0.0 7 | 8 | 9 | cloud.xcan.jmock 10 | JMock 11 | 1.0.0 12 | 13 | 14 | xcan-jmock.test 15 | JMock :: Test 16 | jar 17 | 18 | 19 | 20 | 21 | cloud.xcan.jmock 22 | xcan-jmock.api 23 | ${project.version} 24 | 25 | 26 | 27 | cloud.xcan.jmock 28 | xcan-jmock.core 29 | ${project.version} 30 | 31 | 32 | 33 | cloud.xcan.jmock 34 | xcan-jmock.all-plugin 35 | ${project.version} 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.apache.maven.plugins 43 | maven-compiler-plugin 44 | 45 | 46 | 47 | -parameters 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/locale/mtimezone/MTimeZoneMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.locale.mtimezone; 2 | 3 | 4 | import static java.util.Locale.CHINA; 5 | 6 | import cloud.xcan.jmock.api.FunctionToken; 7 | import cloud.xcan.jmock.api.i18n.MessageResources; 8 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 9 | import cloud.xcan.jmock.plugin.LocaleDocMessage; 10 | import cloud.xcan.jmock.plugin.MTimeZone; 11 | import java.util.ArrayList; 12 | import org.assertj.core.util.Lists; 13 | import org.junit.jupiter.api.Assertions; 14 | import org.junit.jupiter.api.Test; 15 | 16 | public class MTimeZoneMockConstructorTest { 17 | 18 | String chinaLastName = MessageResources.getString(LocaleDocMessage.DATA_TIMEZONE, CHINA); 19 | ArrayList china = Lists.newArrayList(chinaLastName.split("\\|")); 20 | 21 | String str = "上官|慕容"; 22 | ArrayList dist = Lists.newArrayList(str.split("\\|")); 23 | 24 | 25 | @Test 26 | public void MTimeZone() throws Exception { 27 | FunctionToken token = new FunctionToken("MTimeZone", new String[]{}); 28 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 29 | MTimeZone mock = (MTimeZone) parser.parse(token); 30 | Assertions.assertNotNull(mock); 31 | Assertions.assertTrue(china.contains(mock.mock())); 32 | } 33 | 34 | @Test 35 | public void MTimeZone_2() throws Exception { 36 | FunctionToken token = new FunctionToken("MTimeZone", new String[]{str}); 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | MTimeZone mock = (MTimeZone) parser.parse(token); 39 | Assertions.assertNotNull(mock); 40 | Assertions.assertTrue(dist.contains(mock.mock())); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/mprotocol/MProtocolMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.mprotocol; 2 | 3 | 4 | import static java.util.Locale.CHINA; 5 | 6 | import cloud.xcan.jmock.api.FunctionToken; 7 | import cloud.xcan.jmock.api.i18n.MessageResources; 8 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 9 | import cloud.xcan.jmock.plugin.MProtocol; 10 | import cloud.xcan.jmock.plugin.NetworkDocMessage; 11 | import java.util.ArrayList; 12 | import org.assertj.core.util.Lists; 13 | import org.junit.jupiter.api.Assertions; 14 | import org.junit.jupiter.api.Test; 15 | 16 | public class MProtocolMockConstructorTest { 17 | 18 | String chinaMessage = MessageResources.getString(NetworkDocMessage.DATA_PROTOCOL, CHINA); 19 | ArrayList china = Lists.newArrayList(chinaMessage.split("\\|")); 20 | 21 | String str = "jndi|ldap"; 22 | ArrayList dist = Lists.newArrayList(str.split("\\|")); 23 | 24 | @Test 25 | public void MProtocol() throws Exception { 26 | FunctionToken token = new FunctionToken("MProtocol", new String[]{}); 27 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 28 | MProtocol mock = (MProtocol) parser.parse(token); 29 | Assertions.assertNotNull(mock); 30 | Assertions.assertTrue(china.contains(mock.mock())); 31 | } 32 | 33 | @Test 34 | public void MProtocol_1() throws Exception { 35 | FunctionToken token = new FunctionToken("MProtocol", new String[]{str}); 36 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 37 | MProtocol mock = (MProtocol) parser.parse(token); 38 | Assertions.assertNotNull(mock); 39 | Assertions.assertTrue(dist.contains(mock.mock())); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/locale/mlocale/MLocaleMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.locale.mlocale; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MLocale; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MLocaleMockTest { 10 | 11 | @Test 12 | public void case1_fixedJoinerTest() throws Exception { 13 | FunctionToken token = new FunctionToken("Locale", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MLocale mock = (MLocale) parser.parse(token); 16 | for (int i = 0; i < 10; i++) { 17 | String locale = mock.mock(); 18 | System.out.println("value: " + locale); 19 | Assertions.assertTrue(locale.startsWith("zh") ? locale.contains(MLocale.DEFAULT_JOINER) 20 | : !locale.contains(MLocale.DEFAULT_JOINER)); 21 | Assertions.assertTrue(locale.equals("zh_CN") || locale.equals("en")); 22 | } 23 | } 24 | 25 | // * Full MockConstructor: @Locale(joiner) 26 | @Test 27 | public void case1_joinerTest() throws Exception { 28 | FunctionToken token = new FunctionToken("Locale", new String[]{"-"}); 29 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 30 | MLocale mock = (MLocale) parser.parse(token); 31 | for (int i = 0; i < 10; i++) { 32 | String locale = mock.mock(); 33 | System.out.println("value: " + locale); 34 | Assertions.assertTrue(locale.startsWith("zh") ? locale.contains("-") 35 | : !locale.contains("-")); 36 | Assertions.assertTrue(locale.equals("zh-CN") || locale.equals("en")); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/support/utils/ColorUtil.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.support.utils; 2 | 3 | import java.util.Random; 4 | 5 | public class ColorUtil { 6 | 7 | private static final Random RANDOM = new Random(); 8 | 9 | public static String randomHexColor() { 10 | return String.format("#%06X", RANDOM.nextInt(0xFFFFFF + 1)); 11 | } 12 | 13 | public static String randomRgbColor() { 14 | int r = RANDOM.nextInt(256); 15 | int g = RANDOM.nextInt(256); 16 | int b = RANDOM.nextInt(256); 17 | return String.format("rgb(%d, %d, %d)", r, g, b); 18 | } 19 | 20 | public static String randomHslColor() { 21 | int h = RANDOM.nextInt(360); // Hue: 0-360 22 | int s = RANDOM.nextInt(101); // Saturation: 0-100 23 | int l = RANDOM.nextInt(101); // Lightness: 0-100 24 | return String.format("hsl(%d, %d%%, %d%%)", h, s, l); 25 | } 26 | 27 | public static String randomHwbColor() { 28 | int h = RANDOM.nextInt(360); // Hue: 0-360 29 | int w = RANDOM.nextInt(101); // Whiteness: 0-100 30 | int b = RANDOM.nextInt(101); // Blackness: 0-100 31 | return String.format("hwb(%d, %d%%, %d%%)", h, w, b); 32 | } 33 | 34 | public static String randomLchColor() { 35 | int l = RANDOM.nextInt(101); // Lightness: 0-100 36 | int c = RANDOM.nextInt(101); // Chroma: 0-100 37 | int h = RANDOM.nextInt(360); // Hue: 0-360 38 | return String.format("lch(%d, %d, %d)", l, c, h); 39 | } 40 | 41 | public static String randomCmykColor() { 42 | int c = RANDOM.nextInt(101); // Cyan: 0-100 43 | int m = RANDOM.nextInt(101); // Magenta: 0-100 44 | int y = RANDOM.nextInt(101); // Yellow: 0-100 45 | int k = RANDOM.nextInt(101); // Black: 0-100 46 | return String.format("cmyk(%d%%, %d%%, %d%%, %d%%)", c, m, y, k); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /plugins/id/src/main/java/cloud/xcan/jmock/plugin/MGuid.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_CATEGORY_ID; 4 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_GUID_C1; 5 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_GUID_C2; 6 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_GUID_DESC; 7 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_GUID_PARAMETER_FORMAT; 8 | 9 | import cloud.xcan.jmock.api.AbstractMockFunction; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 12 | import cloud.xcan.jmock.api.docs.annotation.JMockParameter; 13 | import lombok.Getter; 14 | import lombok.Setter; 15 | 16 | /** 17 | * @author Hao Guo 18 | * @author XiaoLong Liu 19 | */ 20 | @Setter 21 | @Getter 22 | @JMockFunctionRegister(descI18nKey = DOC_GUID_DESC, 23 | categoryI18nKey = {DOC_CATEGORY_ID}, order = 301) 24 | public class MGuid extends AbstractMockFunction { 25 | 26 | @JMockParameter(descI18nKey = DOC_GUID_PARAMETER_FORMAT) 27 | private Boolean withoutSeparator; 28 | 29 | private MUuid mUuid; 30 | 31 | @JMockConstructor(descI18nKey = DOC_GUID_C1, 32 | example = "@Guid()", 33 | exampleValues = {"JIDLOIFIUDASNVHDLODGHYGONLKDHKP"}) 34 | public MGuid() { 35 | this(MUuid.DEFAULT_WITHOUT_SEPARATOR); 36 | } 37 | 38 | @JMockConstructor(descI18nKey = DOC_GUID_C2, 39 | example = "@Guid(true)", 40 | exampleValues = {"JIDLO-IFIUD-ASNVH-DLODG-HYGON-LKDHKP"}) 41 | public MGuid(Boolean withoutSeparator) { 42 | this.withoutSeparator = withoutSeparator; 43 | this.mUuid = new MUuid(withoutSeparator); 44 | } 45 | 46 | @Override 47 | public String mock() { 48 | return mUuid.mock(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/locale/mlocale/MLocaleMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.locale.mlocale; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MLocale; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MLocaleMockConstructorTest { 10 | 11 | /** 12 | * No-parameter MockConstructor: @Locale() 13 | */ 14 | @Test 15 | public void MLocale1() throws Exception { 16 | FunctionToken token = new FunctionToken("Locale", new String[]{}); 17 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 18 | MLocale mock = (MLocale) parser.parse(token); 19 | Assertions.assertNotNull(mock); 20 | Assertions.assertEquals("_", mock.getJoiner()); 21 | } 22 | 23 | 24 | /** 25 | * Full MockConstructor : @Locale(joiner) 26 | */ 27 | @Test 28 | public void MLocale2() throws Exception { 29 | FunctionToken token = new FunctionToken("Locale", new String[]{"-"}); 30 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 31 | MLocale mock = (MLocale) parser.parse(token); 32 | Assertions.assertNotNull(mock); 33 | Assertions.assertEquals("-", mock.getJoiner()); 34 | } 35 | 36 | /** 37 | * Full MockConstructor : @Locale(joiner) 38 | */ 39 | @Test 40 | public void MLocale3() throws Exception { 41 | FunctionToken token = new FunctionToken("Locale", new String[]{"null"}); 42 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 43 | MLocale mock = (MLocale) parser.parse(token); 44 | Assertions.assertNotNull(mock); 45 | Assertions.assertEquals("_", mock.getJoiner()); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/murl/MUrlMockConstructorMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.murl; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MUrl; 6 | import org.junit.jupiter.api.Assertions; 7 | import org.junit.jupiter.api.Test; 8 | 9 | public class MUrlMockConstructorMockTest { 10 | 11 | @Test 12 | public void url() throws Exception { 13 | FunctionToken token = new FunctionToken("MUrl", new String[]{}); 14 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 15 | MUrl mock = (MUrl) parser.parse(token); 16 | Assertions.assertNotNull(mock); 17 | Assertions.assertEquals("127.0.0.1:8080", mock.getDomain()); 18 | Assertions.assertEquals("http", mock.getProtocol()); 19 | } 20 | 21 | @Test 22 | public void url1() throws Exception { 23 | FunctionToken token = new FunctionToken("MUrl", new String[]{"60"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MUrl mock = (MUrl) parser.parse(token); 26 | Assertions.assertNotNull(mock); 27 | Assertions.assertTrue(!mock.isAllowQueryParams()); 28 | } 29 | 30 | @Test 31 | public void url2() throws Exception { 32 | FunctionToken token = new FunctionToken("MUrl", 33 | new String[]{"60", "https", "www.xcan.org", "true"}); 34 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 35 | MUrl mock = (MUrl) parser.parse(token); 36 | Assertions.assertNotNull(mock); 37 | Assertions.assertEquals("https", mock.getProtocol()); 38 | Assertions.assertEquals("www.xcan.org", mock.getDomain()); 39 | Assertions.assertTrue(mock.isAllowQueryParams()); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /plugins/car/src/main/java/cloud/xcan/jmock/plugin/MBrand.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_BRAND_C1; 4 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_BRAND_DESC; 5 | import static cloud.xcan.jmock.plugin.CarDocMessage.DOC_CATEGORY_CAR; 6 | 7 | import cloud.xcan.jmock.api.AbstractMockFunction; 8 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 10 | import java.security.SecureRandom; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_BRAND_DESC, categoryI18nKey = { 15 | DOC_CATEGORY_CAR}, order = 2001) 16 | public class MBrand extends AbstractMockFunction { 17 | 18 | public static final SecureRandom random = new SecureRandom(); 19 | 20 | // List of car brands including both Chinese domestic and international brands 21 | public static final List CAR_BRANDS = Arrays.asList( 22 | // Chinese domestic brands 23 | "BYD", "Geely", "Chery", "Great Wall", "Changan", 24 | "FAW", "SAIC Motor", "NIO", "XPeng", "Li Auto", 25 | "Hongqi", "BAIC", "GAC", "JAC", "Dongfeng", 26 | 27 | // International brands 28 | "Toyota", "Honda", "Ford", "Chevrolet", "Volkswagen", 29 | "BMW", "Mercedes-Benz", "Audi", "Tesla", "Nissan", 30 | "Hyundai", "Kia", "Volvo", "Subaru", "Mazda", 31 | "Peugeot", "Renault", "Fiat", "Jeep", "Lexus" 32 | ); 33 | 34 | @JMockConstructor(descI18nKey = DOC_BRAND_C1, 35 | example = "@Brand()", 36 | exampleValues = {"Peugeot", "Nissan", "Chery"}) 37 | public MBrand() { 38 | } 39 | 40 | @Override 41 | public String mock() { 42 | return CAR_BRANDS.get(random.nextInt(CAR_BRANDS.size())); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/date/mlocaleDateTime/MLocaleDateTimeMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.date.mlocaleDateTime; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MLocaleDateTime; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MLocaleDateTimeMockConstructorTest { 11 | 12 | /** 13 | * No-parameter MockConstructor: @String() 14 | */ 15 | @Test 16 | public void MLocaleDateDateTime1() throws Exception { 17 | FunctionToken token = new FunctionToken("MLocaleDateTime", new String[]{}); 18 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 19 | MLocaleDateTime mock = (MLocaleDateTime) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | } 22 | 23 | /** 24 | * Basic MockConstructor: @String(length) 25 | */ 26 | @Test 27 | public void MLocaleDateDateTime2() throws Exception { 28 | FunctionToken token = new FunctionToken("MLocaleDateTime", new String[]{"yy-MM-dd"}); 29 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 30 | MLocaleDateTime mock = (MLocaleDateTime) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | } 33 | 34 | @Test 35 | public void MLocaleDateDateTime3() throws Exception { 36 | FunctionToken token = new FunctionToken("MLocaleDateTime", 37 | new String[]{"yy-MM-dd HH:mm:ss", "Asia/Shanghai", "true"}); 38 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 39 | MLocaleDateTime mock = (MLocaleDateTime) parser.parse(token); 40 | Assertions.assertNotNull(mock); 41 | System.out.println(mock.mock()); 42 | } 43 | 44 | 45 | } 46 | -------------------------------------------------------------------------------- /plugins/date/src/main/java/cloud/xcan/jmock/plugin/MTimestamp.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.angus.spec.utils.ObjectUtils.nullSafe; 4 | import static cloud.xcan.jmock.plugin.DateDocMessage.DOC_CATEGORY_DATE; 5 | import static cloud.xcan.jmock.plugin.DateDocMessage.DOC_TIMESTAMP_C1; 6 | import static cloud.xcan.jmock.plugin.DateDocMessage.DOC_TIMESTAMP_C2; 7 | import static cloud.xcan.jmock.plugin.DateDocMessage.DOC_TIMESTAMP_DESC; 8 | import static cloud.xcan.jmock.plugin.DateDocMessage.DOC_TIMESTAMP_PARAMETER_UNIX; 9 | 10 | import cloud.xcan.jmock.api.AbstractMockFunction; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 12 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 13 | import cloud.xcan.jmock.api.docs.annotation.JMockParameter; 14 | import lombok.Getter; 15 | import lombok.Setter; 16 | 17 | /** 18 | * @author Hao Guo 19 | * @author XiaoLong Liu 20 | */ 21 | @Setter 22 | @Getter 23 | @JMockFunctionRegister(descI18nKey = DOC_TIMESTAMP_DESC, 24 | categoryI18nKey = {DOC_CATEGORY_DATE}, order = 201) 25 | public class MTimestamp extends AbstractMockFunction { 26 | 27 | @JMockParameter(descI18nKey = DOC_TIMESTAMP_PARAMETER_UNIX) 28 | private Boolean unix; 29 | 30 | @JMockConstructor(descI18nKey = DOC_TIMESTAMP_C1, 31 | example = "@Timestamp()", 32 | exampleValues = {"1653432546438"}) 33 | public MTimestamp() { 34 | this(false); 35 | } 36 | 37 | @JMockConstructor(descI18nKey = DOC_TIMESTAMP_C2, 38 | example = "@Timestamp()", 39 | exampleValues = {"1653432546438"}) 40 | public MTimestamp(Boolean unix) { 41 | this.unix = nullSafe(unix, false); 42 | } 43 | 44 | @Override 45 | public Long mock() { 46 | return unix ? System.currentTimeMillis() / 1000 : System.currentTimeMillis(); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /plugins/compute/src/main/java/cloud/xcan/jmock/plugin/MBrowser.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_BROWSER_C1; 4 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_BROWSER_DESC; 5 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_CATEGORY_COMPUTE; 6 | 7 | import cloud.xcan.jmock.api.AbstractMockFunction; 8 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 10 | import java.security.SecureRandom; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_BROWSER_DESC, 15 | categoryI18nKey = {DOC_CATEGORY_COMPUTE}, order = 5001) 16 | public class MBrowser extends AbstractMockFunction { 17 | 18 | public static final SecureRandom random = new SecureRandom(); 19 | 20 | public static final List BROWSERS = Arrays.asList( 21 | "Chrome", "Firefox", "Safari", "Edge", "Opera", "Brave", "Vivaldi", "Chromium" 22 | ); 23 | 24 | public static final List BROWSER_VERSIONS = Arrays.asList( 25 | "115", "116", "117", "118", "119", "120", 26 | "100", "101", "102", "103", "104", "105" 27 | ); 28 | 29 | @JMockConstructor(descI18nKey = DOC_BROWSER_C1, 30 | example = "@Browser()", 31 | exampleValues = {"Firefox 119", "Opera 119"}) 32 | public MBrowser() { 33 | } 34 | 35 | @Override 36 | public String mock() { 37 | String browser = BROWSERS.get(random.nextInt(BROWSERS.size())); 38 | String version = BROWSER_VERSIONS.get(random.nextInt(BROWSER_VERSIONS.size())); 39 | 40 | // 80% chance to include version number 41 | if (random.nextDouble() < 0.8) { 42 | return browser + " " + version; 43 | } else { 44 | return browser; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /plugins/compute/src/main/java/cloud/xcan/jmock/plugin/MVulnerability.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_CATEGORY_COMPUTE; 4 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_VULNERABILITY_C1; 5 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_VULNERABILITY_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrowser.random; 7 | 8 | import cloud.xcan.jmock.api.AbstractMockFunction; 9 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | @JMockFunctionRegister(descI18nKey = DOC_VULNERABILITY_DESC, 15 | categoryI18nKey = {DOC_CATEGORY_COMPUTE}, order = 5014) 16 | public class MVulnerability extends AbstractMockFunction { 17 | 18 | public static final List VULNERABILITY_TYPES = Arrays.asList( 19 | "SQL Injection", "Cross-Site Scripting (XSS)", "Cross-Site Request Forgery (CSRF)", 20 | "Remote Code Execution (RCE)", "Buffer Overflow", "Insecure Direct Object References", 21 | "Security Misconfiguration", "Sensitive Data Exposure", "Broken Authentication", 22 | "Server-Side Request Forgery (SSRF)", "XML External Entity (XXE)", 23 | "Insecure Deserialization", "Insufficient Logging & Monitoring", 24 | "Zero-Day Vulnerability", "Privilege Escalation", "Denial of Service (DoS)" 25 | ); 26 | 27 | @JMockConstructor(descI18nKey = DOC_VULNERABILITY_C1, 28 | example = "@Vulnerability()", 29 | exampleValues = {"XML External Entity (XXE)", "Security Misconfiguration"}) 30 | public MVulnerability() { 31 | } 32 | 33 | @Override 34 | public String mock() { 35 | return VULNERABILITY_TYPES.get(random.nextInt(VULNERABILITY_TYPES.size())); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/mprotocol/MProtocolMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.mprotocol; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.api.i18n.MessageResources; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MProtocol; 7 | import cloud.xcan.jmock.plugin.NetworkDocMessage; 8 | import java.util.ArrayList; 9 | import org.assertj.core.util.Lists; 10 | import org.junit.jupiter.api.Assertions; 11 | import org.junit.jupiter.api.Test; 12 | 13 | public class MProtocolMockTest { 14 | 15 | String chinaLastName = MessageResources.getString(NetworkDocMessage.DATA_PROTOCOL); 16 | ArrayList china = Lists.newArrayList(chinaLastName.split("\\|")); 17 | 18 | String str = "jndi|ldap"; 19 | ArrayList dist = Lists.newArrayList(str.split("\\|")); 20 | 21 | @Test 22 | public void case1_defaultTest() throws Exception { 23 | FunctionToken token = new FunctionToken("MProtocol", new String[]{}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MProtocol mock = (MProtocol) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String str = mock.mock(); 28 | System.out.println(str); 29 | Assertions.assertTrue(china.contains(str)); 30 | } 31 | } 32 | 33 | @Test 34 | public void case2() throws Exception { 35 | FunctionToken token = new FunctionToken("MProtocol", new String[]{str}); 36 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 37 | MProtocol mock = (MProtocol) parser.parse(token); 38 | for (int i = 0; i < 10; i++) { 39 | String str = mock.mock(); 40 | System.out.println(str); 41 | Assertions.assertTrue(dist.contains(str)); 42 | } 43 | } 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/support/utils/AppVersionUtils.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api.support.utils; 2 | 3 | import java.util.Objects; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * @author Bao Zhang 8 | * @author XiaoLong Liu 9 | */ 10 | public class AppVersionUtils { 11 | 12 | /** 13 | *

Returns a random appVersion

14 | * 15 | * @param prefixDictArray 16 | * @param releaseStateDictArray 17 | * @param buildStateDictArray 18 | * @return the random appVersion 19 | */ 20 | public static String appVersion(String[] prefixDictArray, 21 | String[] releaseStateDictArray, String[] buildStateDictArray) { 22 | String prefix = StringUtils.EMPTY; 23 | String releaseState = StringUtils.EMPTY; 24 | String buildState = StringUtils.EMPTY; 25 | if (Objects.nonNull(prefixDictArray)) { 26 | Integer prefixIndex = RandomUtils.nextInt(0, prefixDictArray.length); 27 | prefix = prefixDictArray[prefixIndex] + "-"; 28 | } 29 | if (Objects.nonNull(releaseStateDictArray)) { 30 | Integer releaseStateIndex = RandomUtils.nextInt(0, releaseStateDictArray.length); 31 | releaseState = "-" + releaseStateDictArray[releaseStateIndex]; 32 | } 33 | if (Objects.nonNull(buildStateDictArray)) { 34 | Integer buildStateIndex = RandomUtils.nextInt(0, buildStateDictArray.length); 35 | buildState = "+" + buildStateDictArray[buildStateIndex]; 36 | } 37 | String appVersion = buildAppVersion(); 38 | return prefix + appVersion + releaseState + buildState; 39 | } 40 | 41 | public static String buildAppVersion() { 42 | Integer major = RandomUtils.nextInt(0, 255); 43 | Integer minor = RandomUtils.nextInt(0, 255); 44 | Integer patch = RandomUtils.nextInt(0, 255); 45 | return major + "." + minor + "." + patch; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /plugins/financial/src/main/java/cloud/xcan/jmock/plugin/FinancialDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class FinancialDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 70xx. 10 | */ 11 | public final static String DOC_CATEGORY_FINANCIAL = "jmock.func.category.financial"; 12 | 13 | public final static String DOC_AMOUNT_DESC = "jmock.func.MAmount.description"; 14 | public final static String DOC_AMOUNT_C1 = "jmock.func.MAmount.C1"; 15 | public final static String DOC_AMOUNT_C2 = "jmock.func.MAmount.C2"; 16 | 17 | public final static String DOC_BUDGET_CATEGORY_DESC = "jmock.func.MBudgetCategory.description"; 18 | public final static String DOC_BUDGET_CATEGORY_C1 = "jmock.func.MBudgetCategory.C1"; 19 | public final static String DOC_BUDGET_CATEGORY_C2 = "jmock.func.MBudgetCategory.C2"; 20 | 21 | public final static String DOC_CURRENCY_DESC = "jmock.func.MCurrency.description"; 22 | public final static String DOC_CURRENCY_C1 = "jmock.func.MCurrency.C1"; 23 | public final static String DOC_CURRENCY_C2 = "jmock.func.MCurrency.C2"; 24 | 25 | public final static String DOC_INVOICE_NUMBER_DESC = "jmock.func.MInvoiceNumber.description"; 26 | public final static String DOC_INVOICE_NUMBER_C1 = "jmock.func.MInvoiceNumber.C1"; 27 | public final static String DOC_INVOICE_NUMBER_C2 = "jmock.func.MInvoiceNumber.C2"; 28 | 29 | public final static String DOC_TAX_CODE_DESC = "jmock.func.MTaxCode.description"; 30 | public final static String DOC_TAX_CODE_C1 = "jmock.func.MTaxCode.C1"; 31 | public final static String DOC_TAX_CODE_C2 = "jmock.func.MTaxCode.C2"; 32 | 33 | @Override 34 | public void register() { 35 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-financial-plugin-messages"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/locale/mtimezone/MTimeZoneMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.locale.mtimezone; 2 | 3 | import static java.util.Locale.CHINA; 4 | 5 | import cloud.xcan.jmock.api.FunctionToken; 6 | import cloud.xcan.jmock.api.i18n.MessageResources; 7 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 8 | import cloud.xcan.jmock.plugin.LocaleDocMessage; 9 | import cloud.xcan.jmock.plugin.MTimeZone; 10 | import java.util.ArrayList; 11 | import org.assertj.core.util.Lists; 12 | import org.junit.jupiter.api.Assertions; 13 | import org.junit.jupiter.api.Test; 14 | 15 | public class MTimeZoneMockTest { 16 | 17 | String chinaLastName = MessageResources.getString(LocaleDocMessage.DATA_TIMEZONE, CHINA); 18 | ArrayList china = Lists.newArrayList(chinaLastName.split("\\|")); 19 | 20 | String str = "Pacific/Guadalcanal|Asia/Ho_Chi_Minh"; 21 | ArrayList dist = Lists.newArrayList(str.split("\\|")); 22 | 23 | @Test 24 | public void case1_defaultTest() throws Exception { 25 | FunctionToken token = new FunctionToken("MTimeZone", new String[]{}); 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | MTimeZone mock = (MTimeZone) parser.parse(token); 28 | for (int i = 0; i < 10; i++) { 29 | String str = mock.mock(); 30 | System.out.println(str); 31 | Assertions.assertTrue(china.contains(str)); 32 | } 33 | } 34 | 35 | @Test 36 | public void case2() throws Exception { 37 | FunctionToken token = new FunctionToken("MTimeZone", new String[]{str}); 38 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 39 | MTimeZone mock = (MTimeZone) parser.parse(token); 40 | for (int i = 0; i < 10; i++) { 41 | String str = mock.mock(); 42 | System.out.println("str = " + str); 43 | Assertions.assertTrue(dist.contains(str)); 44 | } 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /plugins/id/src/main/java/cloud/xcan/jmock/plugin/MUuid.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_CATEGORY_ID; 4 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_UUID_C1; 5 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_UUID_C2; 6 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_UUID_DESC; 7 | import static cloud.xcan.jmock.plugin.IDDocMessage.DOC_UUID_PARAMETER_FORMAT; 8 | 9 | import cloud.xcan.jmock.api.AbstractMockFunction; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 12 | import cloud.xcan.jmock.api.docs.annotation.JMockParameter; 13 | import cloud.xcan.jmock.api.support.utils.UUIDUtils; 14 | import lombok.Getter; 15 | import lombok.Setter; 16 | 17 | /** 18 | * @author Hao Guo 19 | * @author XiaoLong Liu 20 | */ 21 | @Setter 22 | @Getter 23 | @JMockFunctionRegister(descI18nKey = DOC_UUID_DESC, 24 | categoryI18nKey = {DOC_CATEGORY_ID}, order = 302) 25 | public class MUuid extends AbstractMockFunction { 26 | 27 | @JMockParameter(descI18nKey = DOC_UUID_PARAMETER_FORMAT) 28 | private Boolean withoutSeparator; 29 | 30 | /** 31 | * Max value of Integer allowed 32 | */ 33 | final static boolean DEFAULT_WITHOUT_SEPARATOR = false; 34 | 35 | @JMockConstructor(descI18nKey = DOC_UUID_C1, 36 | example = "@Uuid()", 37 | exampleValues = {"JIDLOIFIUDASNVHDLODGHYGONLKDHKP"}) 38 | public MUuid() { 39 | this(DEFAULT_WITHOUT_SEPARATOR); 40 | } 41 | 42 | @JMockConstructor(descI18nKey = DOC_UUID_C2, 43 | example = "@Uuid(true)", 44 | exampleValues = {"JIDLO-IFIUD-ASNVH-DLODG-HYGON-LKDHKP"}) 45 | public MUuid(Boolean withoutSeparator) { 46 | this.withoutSeparator = withoutSeparator; 47 | } 48 | 49 | @Override 50 | public String mock() { 51 | return UUIDUtils.randomStringUUID(withoutSeparator); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /plugins/crypto/src/main/resources/i18n/jmock-crypto-plugin-messages_en.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.crypto=Cipher 2 | #--------------------------MBase64--------------------------- 3 | jmock.func.MBase64.description=Generate Base64 string 4 | jmock.func.MBase64.parameter.length=String length 5 | jmock.func.MBase64.C1=Generate default random string with 128 characters 6 | jmock.func.MBase64.C2=Generate random string with specified character length 7 | #--------------------------MHash--------------------------- 8 | jmock.func.MHash.description=Generate hash value 9 | jmock.func.MHash.parameter.algorithm=Hash algorithm, e.g., MD5, SHA-256, etc. 10 | jmock.func.MHash.C1=Generate default random MD5 hash value 11 | jmock.func.MHash.C2=Generate random hash value with specified algorithm 12 | #--------------------------MHex--------------------------- 13 | jmock.func.MHex.description=Generate hexadecimal value 14 | jmock.func.MHex.parameter.length=Hexadecimal value length 15 | jmock.func.MHex.C1=Generate default 8-character long hexadecimal value 16 | jmock.func.MHex.C2=Generate hexadecimal value with specified character length 17 | #--------------------------MKeyPair--------------------------- 18 | jmock.func.MKeyPair.description=Generate key pair 19 | jmock.func.MKeyPair.parameter.algorithm=Generation algorithm, e.g., RSA, EC, DSA 20 | jmock.func.MKeyPair.parameter.keySize=Key size, e.g., 2048 RSA, 256 EC 21 | jmock.func.MKeyPair.C1=Generate default RSA algorithm key pair with size 526 22 | jmock.func.MKeyPair.C2=Generate random key pair with specified algorithm and key size 23 | #--------------------------MSymmetricKey--------------------------- 24 | jmock.func.MSymmetricKey.description=Generate symmetric encryption key 25 | jmock.func.MSymmetric.parameter.algorithm=Generation algorithm, e.g., RSA, EC, DSA 26 | jmock.func.MSymmetricKey.C1=Generate default AES algorithm encryption key 27 | jmock.func.MSymmetricKey.C2=Generate encryption key with specified algorithm 28 | -------------------------------------------------------------------------------- /plugins/network/src/main/java/cloud/xcan/jmock/plugin/MAppName.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.api.i18n.JMockFuncDocMessage.DOC_PARAMETER_DICT; 4 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_APP_NAME_C1; 5 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_APP_NAME_C2; 6 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_APP_NAME_DESC; 7 | import static cloud.xcan.jmock.plugin.NetworkDocMessage.DOC_CATEGORY_NETWORK; 8 | 9 | import cloud.xcan.jmock.api.AbstractMockFunction; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 12 | import cloud.xcan.jmock.api.docs.annotation.JMockParameter; 13 | import cloud.xcan.jmock.api.i18n.MessageResources; 14 | import cloud.xcan.jmock.api.support.utils.RandomUtils; 15 | import lombok.Getter; 16 | import lombok.Setter; 17 | 18 | /** 19 | * @author Bao Zhang 20 | * @author XiaoLong Liu 21 | */ 22 | @Setter 23 | @Getter 24 | @JMockFunctionRegister(descI18nKey = DOC_APP_NAME_DESC, 25 | categoryI18nKey = {DOC_CATEGORY_NETWORK}, order = 901) 26 | public class MAppName extends AbstractMockFunction { 27 | 28 | @JMockParameter(descI18nKey = DOC_PARAMETER_DICT) 29 | private String dict; 30 | 31 | private transient String[] dictArray; 32 | 33 | @JMockConstructor(descI18nKey = DOC_APP_NAME_C1, 34 | example = "@AppName()", 35 | exampleValues = {"搜狐新闻", "百度手机浏览器"}) 36 | public MAppName() { 37 | this(MessageResources.getString(NetworkDocMessage.DATA_APP_NAME)); 38 | } 39 | 40 | @JMockConstructor(descI18nKey = DOC_APP_NAME_C2, 41 | example = "@AppName(星链|360|ie))", 42 | exampleValues = {"360", "星链"}) 43 | public MAppName(String dict) { 44 | this.dictArray = dict.split("\\|"); 45 | } 46 | 47 | @Override 48 | public String mock() { 49 | Integer dictIndex = RandomUtils.nextInt(0, dictArray.length); 50 | return dictArray[dictIndex]; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /plugins/compute/src/main/java/cloud/xcan/jmock/plugin/MFilePath.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_CATEGORY_COMPUTE; 4 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_FILE_PATH_C1; 5 | import static cloud.xcan.jmock.plugin.ComputeDocMessage.DOC_FILE_PATH_DESC; 6 | import static cloud.xcan.jmock.plugin.MBrowser.random; 7 | import static cloud.xcan.jmock.plugin.MFileName.generateRandomFileName; 8 | 9 | import cloud.xcan.jmock.api.AbstractMockFunction; 10 | import cloud.xcan.jmock.api.docs.annotation.JMockConstructor; 11 | import cloud.xcan.jmock.api.docs.annotation.JMockFunctionRegister; 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | @JMockFunctionRegister(descI18nKey = DOC_FILE_PATH_DESC, 16 | categoryI18nKey = {DOC_CATEGORY_COMPUTE}, order = 5009) 17 | public class MFilePath extends AbstractMockFunction { 18 | 19 | public static final List WINDOWS_PATHS = Arrays.asList( 20 | "C:\\Program Files\\", "D:\\Projects\\", "C:\\Users\\Admin\\Documents\\", 21 | "E:\\Backups\\", "C:\\Windows\\System32\\", "F:\\Media\\Photos\\" 22 | ); 23 | 24 | public static final List UNIX_PATHS = Arrays.asList( 25 | "/home/user/", "/usr/local/bin/", "/var/log/", "/etc/", 26 | "/opt/apps/", "/mnt/data/", "/tmp/", "/root/" 27 | ); 28 | 29 | @JMockConstructor(descI18nKey = DOC_FILE_PATH_C1, 30 | example = "@FilePath()", 31 | exampleValues = {"F:\\Media\\Photos\\report_jan.exe", "/tmp/archive_jan.pdf"}) 32 | public MFilePath() { 33 | } 34 | 35 | @Override 36 | public String mock() { 37 | if (random.nextBoolean()) { 38 | // Windows path 39 | String base = WINDOWS_PATHS.get(random.nextInt(WINDOWS_PATHS.size())); 40 | return base + generateRandomFileName(); 41 | } else { 42 | // Unix-like path 43 | String base = UNIX_PATHS.get(random.nextInt(UNIX_PATHS.size())); 44 | return base + generateRandomFileName(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/basic/mbool/MBoolMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.basic.mbool; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MBool; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MBoolMockTest { 9 | 10 | @Test 11 | public void case1_1t() throws Exception { 12 | FunctionToken token = new FunctionToken("MBool", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MBool mock = (MBool) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String str = mock.mock(); 17 | System.out.println("str = " + str); 18 | } 19 | } 20 | 21 | @Test 22 | public void case2() throws Exception { 23 | FunctionToken token = new FunctionToken("MBool", new String[]{"1:1"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MBool mock = (MBool) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String str = mock.mock(); 28 | System.out.println("str = " + str); 29 | } 30 | } 31 | 32 | @Test 33 | public void case3() throws Exception { 34 | FunctionToken token = new FunctionToken("MBool", new String[]{"1:1", "1:1"}); 35 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | MBool mock = (MBool) parser.parse(token); 37 | for (int i = 0; i < 10; i++) { 38 | String str = mock.mock(); 39 | System.out.println("str = " + str); 40 | } 41 | } 42 | 43 | @Test 44 | public void case4() throws Exception { 45 | FunctionToken token = new FunctionToken("MBool", new String[]{"1:1", "1:1", "男|女"}); 46 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 47 | MBool mock = (MBool) parser.parse(token); 48 | for (int i = 0; i < 10; i++) { 49 | String str = mock.mock(); 50 | System.out.println("str = " + str); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mcoordinates/MCoordinatesMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mcoordinates; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MCoordinates; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MCoordinatesMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MCoordinates1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Coordinates", 18 | new String[]{}); 19 | MCoordinates mock = (MCoordinates) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertEquals(-180, mock.getMinLng()); 22 | Assertions.assertEquals(180, mock.getMaxLng()); 23 | Assertions.assertEquals(-90, mock.getMinLat()); 24 | Assertions.assertEquals(90, mock.getMaxLat()); 25 | Assertions.assertEquals("0.000000", mock.getScalePattern()); 26 | Assertions.assertEquals(0.0, mock.getNullWeight()); 27 | } 28 | 29 | /** 30 | * Full MockConstructor: @MCoordinates(minLng,maxLng,minLat,maxLat,scale,nullWeight) 31 | */ 32 | @Test 33 | public void MCoordinates2() throws Exception { 34 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 35 | FunctionToken token = new FunctionToken("Coordinates", 36 | new String[]{"-170D", "150D", "-80D", "70D", "6", "2:8"}); 37 | MCoordinates mock = (MCoordinates) parser.parse(token); 38 | Assertions.assertNotNull(mock); 39 | Assertions.assertEquals(-170, mock.getMinLng()); 40 | Assertions.assertEquals(150, mock.getMaxLng()); 41 | Assertions.assertEquals(-80, mock.getMinLat()); 42 | Assertions.assertEquals(70, mock.getMaxLat()); 43 | Assertions.assertEquals("0.000000", mock.getScalePattern()); 44 | Assertions.assertEquals(0.2, mock.getNullWeight()); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /api/src/main/java/cloud/xcan/jmock/api/FunctionToken.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.api; 2 | 3 | import static cloud.xcan.angus.spec.utils.ObjectUtils.mapEquals; 4 | import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.Objects; 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | @Setter 13 | @Getter 14 | public class FunctionToken extends AbstractToken { 15 | 16 | /** 17 | * The default function identifier extractor of the expression 18 | */ 19 | private char identifier = TokenChars.FUNC_IDENTIFIER; 20 | 21 | private Map params; 22 | 23 | public FunctionToken(String name, String[] params) { 24 | super(name); 25 | if (isNotEmpty(params)) { 26 | Map paramsMap = new HashMap<>(); 27 | for (int i = 1; i <= params.length; i++) { 28 | paramsMap.put(String.valueOf(i), params[i - 1]); 29 | } 30 | this.params = paramsMap; 31 | } 32 | } 33 | 34 | public FunctionToken(String name, Map params) { 35 | super(name); 36 | this.params = params; 37 | } 38 | 39 | public FunctionToken(char identifier, String name, int startPos, int endPos, 40 | Map params, String token) { 41 | super(name, startPos, endPos, token); 42 | this.identifier = identifier; 43 | this.params = params; 44 | } 45 | 46 | @Override 47 | public String prefixIdentifier() { 48 | return this.identifier + super.name() + TokenChars.FUNC_PARAM_START; 49 | } 50 | 51 | @Override 52 | public boolean equals(Object o) { 53 | if (this == o) { 54 | return true; 55 | } 56 | if (!(o instanceof FunctionToken that)) { 57 | return false; 58 | } 59 | if (!super.equals(o)) { 60 | return false; 61 | } 62 | return identifier == that.identifier && mapEquals(params, that.params); 63 | } 64 | 65 | @Override 66 | public int hashCode() { 67 | return Objects.hash(super.hashCode(), identifier, params); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /plugins/id/src/main/java/cloud/xcan/jmock/plugin/IDDocMessage.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin; 2 | 3 | import cloud.xcan.jmock.api.i18n.MessageResources; 4 | import cloud.xcan.jmock.api.i18n.RegisterDocMessage; 5 | 6 | public class IDDocMessage implements RegisterDocMessage { 7 | 8 | /** 9 | * Coding order by 3xx. 10 | */ 11 | public static final String DOC_CATEGORY_ID = "jmock.func.category.id"; 12 | 13 | public static final String DOC_GUID_DESC = "jmock.func.MGuid.description"; 14 | public static final String DOC_GUID_PARAMETER_FORMAT = "jmock.func.MGuid.parameter.withoutSeparator"; 15 | public static final String DOC_GUID_C1 = "jmock.func.MGuid.C1"; 16 | public static final String DOC_GUID_C2 = "jmock.func.MGuid.C2"; 17 | 18 | public static final String DOC_UUID_DESC = "jmock.func.MUuid.description"; 19 | public static final String DOC_UUID_PARAMETER_FORMAT = "jmock.func.MUuid.parameter.withoutSeparator"; 20 | public static final String DOC_UUID_C1 = "jmock.func.MUuid.C1"; 21 | public static final String DOC_UUID_C2 = "jmock.func.MUuid.C2"; 22 | 23 | public static final String DOC_SNOWID_DESC = "jmock.func.MSnowId.description"; 24 | public static final String DOC_SNOWID_PARAMETER_DCID = "jmock.func.MSnowId.parameter.dcId"; 25 | public static final String DOC_SNOWID_PARAMETER_MID = "jmock.func.MSnowId.parameter.mId"; 26 | public static final String DOC_SNOWID_C1 = "jmock.func.MSnowId.C1"; 27 | public static final String DOC_SNOWID_C2 = "jmock.func.MSnowId.C2"; 28 | 29 | public static final String DOC_INCID_DESC = "jmock.func.MIncId.description"; 30 | public static final String DOC_INCID_PARAMETER_INIT = "jmock.func.MIncId.parameter.init"; 31 | public static final String DOC_INCID_PARAMETER_STEP = "jmock.func.MIncId.parameter.step"; 32 | public static final String DOC_INCID_C1 = "jmock.func.MIncId.C1"; 33 | public static final String DOC_INCID_C2 = "jmock.func.MIncId.C2"; 34 | 35 | @Override 36 | public void register() { 37 | MessageResources.RESOURCE_BUNDLE.add("i18n/jmock-id-plugin-messages"); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/geography/mcountry/MCountryMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.geography.mcountry; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MCountry; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MCountryMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MCountry1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Country", 18 | new String[]{}); 19 | MCountry mock = (MCountry) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertNotNull(mock.getDict()); 22 | } 23 | 24 | @Test 25 | public void MCountry2() throws Exception { 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | 28 | FunctionToken token = new FunctionToken("Country", 29 | new String[]{"en"}); 30 | MCountry mock = (MCountry) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | Assertions.assertNotNull(mock.getDict()); 33 | } 34 | 35 | @Test 36 | public void MCountry3() throws Exception { 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | 39 | FunctionToken token = new FunctionToken("Country", 40 | new String[]{"等我,耳机,佛山"}); 41 | MCountry mock = (MCountry) parser.parse(token); 42 | Assertions.assertNotNull(mock); 43 | Assertions.assertNotNull(mock.getDict()); 44 | } 45 | 46 | @Test 47 | public void MCountry4() throws Exception { 48 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 49 | 50 | FunctionToken token = new FunctionToken("Country", 51 | new String[]{"zh_CN", "等我,耳机,佛山"}); 52 | MCountry mock = (MCountry) parser.parse(token); 53 | Assertions.assertNotNull(mock); 54 | Assertions.assertNotNull(mock.getDict()); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/network/murl/MUrlMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.network.murl; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MUrl; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MUrlMockTest { 9 | 10 | @Test 11 | public void url() throws Exception { 12 | FunctionToken token = new FunctionToken("MUrl", new String[]{}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MUrl mock = (MUrl) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String url = mock.mock(); 17 | System.out.println("url = " + url); 18 | } 19 | } 20 | 21 | @Test 22 | public void url1() throws Exception { 23 | FunctionToken token = new FunctionToken("MUrl", new String[]{"80"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MUrl mock = (MUrl) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String url = mock.mock(); 28 | System.out.println("url = " + url); 29 | } 30 | } 31 | 32 | @Test 33 | public void url2() throws Exception { 34 | FunctionToken token = new FunctionToken("MUrl", 35 | new String[]{"60", "https", "www.xcan.org", "true"}); 36 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 37 | MUrl mock = (MUrl) parser.parse(token); 38 | for (int i = 0; i < 10; i++) { 39 | String url = mock.mock(); 40 | System.out.println("url = " + url); 41 | } 42 | } 43 | 44 | @Test 45 | public void url3() throws Exception { 46 | FunctionToken token = new FunctionToken("MUrl", 47 | new String[]{"60", "https", "www.xcan.org", "false"}); 48 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 49 | MUrl mock = (MUrl) parser.parse(token); 50 | for (int i = 0; i < 10; i++) { 51 | String url = mock.mock(); 52 | System.out.println("url = " + url); 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/article/msentence/MSentenceMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.article.msentence; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MSentence; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MSentenceMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MSentence1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Sentence", 18 | new String[]{}); 19 | MSentence mock = (MSentence) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertNotNull(mock.getDict()); 22 | } 23 | 24 | @Test 25 | public void MSentence2() throws Exception { 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | 28 | FunctionToken token = new FunctionToken("Sentence", 29 | new String[]{"en"}); 30 | MSentence mock = (MSentence) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | Assertions.assertNotNull(mock.getDict()); 33 | } 34 | 35 | @Test 36 | public void MSentence3() throws Exception { 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | 39 | FunctionToken token = new FunctionToken("Sentence", 40 | new String[]{"等我,耳机,佛山"}); 41 | MSentence mock = (MSentence) parser.parse(token); 42 | Assertions.assertNotNull(mock); 43 | Assertions.assertNotNull(mock.getDict()); 44 | } 45 | 46 | @Test 47 | public void MSentence4() throws Exception { 48 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 49 | 50 | FunctionToken token = new FunctionToken("Sentence", 51 | new String[]{"zh_CN", "等我,耳机,佛山"}); 52 | MSentence mock = (MSentence) parser.parse(token); 53 | Assertions.assertNotNull(mock); 54 | Assertions.assertNotNull(mock.getDict()); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /core/src/test/java/cloud/xcan/jmock/core/support/i18n/MessageResourcesTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.support.i18n; 2 | 3 | 4 | import cloud.xcan.jmock.api.i18n.MessageResources; 5 | import java.util.Locale; 6 | import java.util.ResourceBundle; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MessageResourcesTest { 11 | 12 | String messageKey = "jmock.func.param.size.t"; 13 | String enMessageTemplate = "Parameter {0} must be between {1} and {2}"; 14 | String enMessage = "Parameter length must be between 1 and 10"; 15 | String chMessageTemplate = "参数{0}个数必须在{1}和{2}之间"; 16 | String chMessage = "参数length个数必须在1和10之间"; 17 | 18 | @Test 19 | public void changeLocaleTest() { 20 | ResourceBundle RESOURCES = ResourceBundle.getBundle("i18n/jmock-messages", Locale.US); 21 | Assertions.assertEquals("en", RESOURCES.getLocale().getLanguage()); 22 | Assertions.assertEquals(enMessageTemplate, RESOURCES.getString(messageKey)); 23 | 24 | Locale.setDefault(new Locale("zh", "CN")); 25 | RESOURCES = ResourceBundle.getBundle("i18n/jmock-messages"); 26 | Assertions.assertEquals("", RESOURCES.getLocale().getLanguage()); 27 | Assertions.assertEquals(chMessageTemplate, RESOURCES.getString(messageKey)); 28 | 29 | Locale.setDefault(new Locale("en")); 30 | } 31 | 32 | @Test 33 | public void getString() { 34 | String message = MessageResources.getString(messageKey, Locale.US); 35 | Assertions.assertEquals(enMessageTemplate, message); 36 | message = MessageResources.getString(messageKey, new Locale("zh", "CN")); 37 | Assertions.assertEquals(chMessageTemplate, message); 38 | } 39 | 40 | @Test 41 | public void getStringWithParamTest() { 42 | String message = MessageResources.getString(messageKey, new Object[]{"length", 1, 10}, 43 | Locale.US); 44 | Assertions.assertEquals(enMessage, message); 45 | message = MessageResources.getString(messageKey, new Object[]{"length", 1, 10}, 46 | new Locale("zh", "CN")); 47 | Assertions.assertEquals(chMessage, message); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/user/meducation/MEducationMockConstructorTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.user.meducation; 2 | 3 | 4 | import cloud.xcan.jmock.api.FunctionToken; 5 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 6 | import cloud.xcan.jmock.plugin.MEducation; 7 | import org.junit.jupiter.api.Assertions; 8 | import org.junit.jupiter.api.Test; 9 | 10 | public class MEducationMockConstructorTest { 11 | 12 | 13 | @Test 14 | public void MEducation1() throws Exception { 15 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 16 | 17 | FunctionToken token = new FunctionToken("Education", 18 | new String[]{}); 19 | MEducation mock = (MEducation) parser.parse(token); 20 | Assertions.assertNotNull(mock); 21 | Assertions.assertNotNull(mock.getDict()); 22 | } 23 | 24 | @Test 25 | public void MEducation2() throws Exception { 26 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 27 | 28 | FunctionToken token = new FunctionToken("Education", 29 | new String[]{"en"}); 30 | MEducation mock = (MEducation) parser.parse(token); 31 | Assertions.assertNotNull(mock); 32 | Assertions.assertNotNull(mock.getDict()); 33 | } 34 | 35 | @Test 36 | public void MEducation3() throws Exception { 37 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 38 | 39 | FunctionToken token = new FunctionToken("Education", 40 | new String[]{"等我,耳机,佛山"}); 41 | MEducation mock = (MEducation) parser.parse(token); 42 | Assertions.assertNotNull(mock); 43 | Assertions.assertNotNull(mock.getDict()); 44 | } 45 | 46 | @Test 47 | public void MEducation4() throws Exception { 48 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 49 | 50 | FunctionToken token = new FunctionToken("Education", 51 | new String[]{"zh_CN", "等我,耳机,佛山"}); 52 | MEducation mock = (MEducation) parser.parse(token); 53 | Assertions.assertNotNull(mock); 54 | Assertions.assertNotNull(mock.getDict()); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /core/src/test/java/cloud/xcan/jmock/core/support/utils/WeightedRandomSamplingAlgorithmTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.core.support.utils; 2 | 3 | import java.util.Random; 4 | 5 | public class WeightedRandomSamplingAlgorithmTest { 6 | 7 | 8 | public void weightedRandomSelect(int times, double[] weights) { 9 | 10 | System.out.println("DocGenerator weight: " + weights[0]); 11 | System.out.println("B weight: " + weights[1]); 12 | System.out.println("C weight: " + weights[2]); 13 | 14 | double totalWeight = 0; 15 | for (double n : weights) { 16 | totalWeight += n; 17 | } 18 | for (int i = 0; i < weights.length; i++) { 19 | weights[i] = weights[i] / totalWeight; 20 | } 21 | 22 | int[] count = new int[3]; 23 | for (int i = 0; i < times; i++) { 24 | double random = new Random().nextDouble(); 25 | double countWeight = 0; 26 | for (int index = 0; index < weights.length; index++) { 27 | countWeight += weights[index]; 28 | if (countWeight >= random) { 29 | count[index]++; // Hit 30 | break; 31 | } 32 | } 33 | } 34 | 35 | System.out 36 | .println("DocGenerator Hit:" + count[0] + ", " + 100 * count[0] / (double) times + "%"); 37 | System.out.println("B Hit:" + count[1] + ", " + 100 * count[1] / (double) times + "%"); 38 | System.out.println("C Hit:" + count[2] + ", " + 100 * count[2] / (double) times + "%"); 39 | } 40 | 41 | public static void main(String[] args) { 42 | WeightedRandomSamplingAlgorithmTest w = new WeightedRandomSamplingAlgorithmTest(); 43 | 44 | System.out.println("\n-------------------Case 1-----------------"); 45 | double[] case1 = {4, 4, 8}; 46 | w.weightedRandomSelect(10000, case1); 47 | 48 | System.out.println("\n-------------------Case 2-----------------"); 49 | double[] case2 = {0.40, 0.80, 0.20}; 50 | w.weightedRandomSelect(10000, case2); 51 | 52 | System.out.println("\n-------------------Case 3-----------------"); 53 | 54 | double[] case3 = {0.20, 0.30, 0.50}; 55 | w.weightedRandomSelect(10000, case3); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /test/src/test/java/cloud/xcan/jmock/plugin/basic/mregexp/MRegExpMockTest.java: -------------------------------------------------------------------------------- 1 | package cloud.xcan.jmock.plugin.basic.mregexp; 2 | 3 | import cloud.xcan.jmock.api.FunctionToken; 4 | import cloud.xcan.jmock.core.parser.SimpleMockFunctionTokenParser; 5 | import cloud.xcan.jmock.plugin.MRegExp; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class MRegExpMockTest { 9 | 10 | @Test 11 | public void case1() throws Exception { 12 | FunctionToken token = new FunctionToken("RegExp", new String[]{"[a-z][a-z][0-9]{2}"}); 13 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 14 | MRegExp mock = (MRegExp) parser.parse(token); 15 | for (int i = 0; i < 10; i++) { 16 | String str = mock.mock(); 17 | System.out.println("str = " + str); 18 | } 19 | } 20 | 21 | @Test 22 | public void case2() throws Exception { 23 | FunctionToken token = new FunctionToken("RegExp", new String[]{"[a-z][a-z][0-9]{2}", "1:1"}); 24 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 25 | MRegExp mock = (MRegExp) parser.parse(token); 26 | for (int i = 0; i < 10; i++) { 27 | String str = mock.mock(); 28 | System.out.println("str = " + str); 29 | } 30 | } 31 | 32 | // @Test 33 | // public void case3() throws Exception { 34 | // FunctionToken token = new FunctionToken("RegExp", new String[]{"[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"}); 35 | // SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 36 | // MRegExp mock = (MRegExp) parser.parse(token); 37 | // for (int i = 0; i < 10; i++) { 38 | // String str = mock.mock(); 39 | // } 40 | // } 41 | 42 | @Test 43 | public void case4() throws Exception { 44 | FunctionToken token = new FunctionToken("RegExp", new String[]{"(1[3-9]\\d{9})"}); 45 | SimpleMockFunctionTokenParser parser = new SimpleMockFunctionTokenParser(); 46 | MRegExp mock = (MRegExp) parser.parse(token); 47 | for (int i = 0; i < 10; i++) { 48 | String str = mock.mock(); 49 | System.out.println("mobile = " + str); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /plugins/locale/src/main/resources/i18n/jmock-locale-plugin-messages.properties: -------------------------------------------------------------------------------- 1 | jmock.func.category.locale=\u672C\u5730\u5316 2 | jmock.func.data.timezone=Australia/Darwin|Australia/Sydney|America/Argentina/Buenos_Aires|Africa/Cairo|America/Anchorage|America/Sao_Paulo|Asia/Dhaka|Africa/Harare|America/St_Johns|America/Chicago|Asia/Shanghai|Africa/Addis_Ababa|Europe/Paris|America/Indiana/Indianapolis|Asia/Kolkata|Asia/Tokyo|Pacific/Apia|Asia/Yerevan|Pacific/Auckland|Asia/Karachi|America/Phoenix|America/Puerto_Rico|America/Los_Angeles|Pacific/Guadalcanal|Asia/Ho_Chi_Minh 3 | #--------------------------MLocale------------------------------------ 4 | jmock.func.MLocale.description=\u751F\u6210\u56FD\u9645\u5316\u914D\u7F6E\uFF0C\u5305\u62EC\u8BED\u8A00\u548C\u56FD\u5BB6\u533A\u57DF 5 | jmock.func.MLocale.parameter.joiner=\u56FD\u5BB6\u548C\u8BED\u8A00\u8FDE\u63A5\u7B26.\u652F\u6301\u4E00\u4E2A\u5B57\u7B26,\u9ED8\u8BA4\u4F7F\u7528 "_" 6 | jmock.func.MLocale.C1=\u751F\u6210\u4E00\u4E2A\u56FD\u9645\u5316\u914D\u7F6E\uFF0C\u5305\u62EC\u8BED\u8A00\u548C\u56FD\u5BB6\u533A\u57DF 7 | jmock.func.MLocale.C2=\u751F\u6210\u4E00\u4E2A\u56FD\u9645\u5316\u914D\u7F6E\uFF0C\u5305\u62EC\u8BED\u8A00\u548C\u56FD\u5BB6\u533A\u57DF\uFF0C\u8FDE\u63A5\u7B26\u4F7F\u7528joiner 8 | #--------------------------MTimeZone------------------------------------ 9 | jmock.func.MTimeZone.description=\u751F\u6210\u56FD\u9645\u5316\u65F6\u533A 10 | jmock.func.MTimeZone.parameter.dict=\u533A\u57DF\u5B57\u5178\uFF0C\u591A\u4E2A\u533A\u57DF\u201C|\u201D\u5206\u5272\uFF0C\u9ED8\u8BA4\u503C\uFF1AAustralia/Darwin|Australia/Sydney|America/Argentina/Buenos_Aires|Africa/Cairo|America/Anchorage|America/Sao_Paulo|Asia/Dhaka|Africa/Harare|America/St_Johns|America/Chicago|Asia/Shanghai|Africa/Addis_Ababa|Europe/Paris|America/Indiana/Indianapolis|Asia/Kolkata|Asia/Tokyo|Pacific/Apia|Asia/Yerevan|Pacific/Auckland|Asia/Karachi|America/Phoenix|America/Puerto_Rico|America/Los_Angeles|Pacific/Guadalcanal|Asia/Ho_Chi_Minh 11 | jmock.func.MTimeZone.C1=\u751F\u6210\u4E00\u4E2A\u56FD\u9645\u5316\u65F6\u533A 12 | jmock.func.MTimeZone.C2=\u751F\u6210\u4E00\u4E2A\u56FD\u9645\u5316\u65F6\u533A\uFF0C\u533A\u57DF\u5B57\u5178\u4F7F\u7528dict 13 | --------------------------------------------------------------------------------