From dab21b6710282676263b3ae6fe7dbf53d7e5628c Mon Sep 17 00:00:00 2001 From: shuiyu1123 Date: Fri, 26 Jun 2026 22:10:18 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0=E6=89=A9=E5=B1=95=20?= =?UTF-8?q?API=20=E6=B5=8B=E8=AF=95=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 测试 android.os 模块 (Build, SystemClock, Environment, Process, Bundle, BatteryManager, PowerManager, Vibrator, PatternMatcher, FileUtils) - 测试 android.content 模块 (Uri, ContentValues, Context, SharedPreferences, ComponentName, ClipData, ClipboardManager) - 测试 android.app 模块 (Intent, Notification, NotificationManager, AlarmManager) - 测试 android.graphics 模块 (Color, Bitmap, Paint, Rect) - 测试 java 模块 (String, StringBuilder, Integer, Math, ArrayList, HashMap, JSONObject, File) - 所有测试通过 --- test_scripts/test_extended_api.py | 400 ++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 test_scripts/test_extended_api.py diff --git a/test_scripts/test_extended_api.py b/test_scripts/test_extended_api.py new file mode 100644 index 0000000..5f09fd8 --- /dev/null +++ b/test_scripts/test_extended_api.py @@ -0,0 +1,400 @@ +# -*- coding: utf-8 -*- +""" +扩展 Android API 测试脚本 +测试 android.os, android.content, android.app, android.widget, android.graphics 等模块 +""" + +import sys +import os +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +def test_os_module(): + """测试 android.os 模块""" + print("\n" + "=" * 60) + print("android.os 模块测试") + print("=" * 60) + + from android_pyapi.android.os import ( + Build, SystemClock, Environment, Process, + Bundle, Handler, Looper, Message, + BatteryManager, PowerManager, Vibrator, + AsyncTask, CountDownTimer, Messenger, + FileObserver, FileUtils, PatternMatcher, + ) + + # Build 测试 + print("\n[Build 设备信息]") + print(f" MODEL: {Build.MODEL}") + print(f" MANUFACTURER: {Build.MANUFACTURER}") + print(f" BRAND: {Build.BRAND}") + print(f" DEVICE: {Build.DEVICE}") + print(f" FINGERPRINT: {Build.FINGERPRINT}") + print(f" SDK_INT: {Build.VERSION.SDK_INT}") + print(f" RELEASE: {Build.VERSION.RELEASE}") + + # SystemClock 测试 + print("\n[SystemClock 系统时钟]") + print(f" 启动时间: {SystemClock.elapsedRealtime()} ms") + print(f" 运行时间: {SystemClock.uptimeMillis()} ms") + + # Environment 测试 + print("\n[Environment 环境目录]") + print(f" 外部存储: {Environment.getExternalStorageDirectory()}") + print(f" 下载目录: {Environment.getExternalStoragePublicDirectory('Download')}") + print(f" 数据目录: {Environment.getDataDirectory()}") + print(f" 根目录: {Environment.getRootDirectory()}") + + # Process 测试 + print("\n[Process 进程信息]") + print(f" PID: {Process.myPid()}") + print(f" TID: {Process.myTid()}") + + # Bundle 测试 + print("\n[Bundle 数据容器]") + bundle = Bundle() + bundle.putString("name", "Android-pyApi") + bundle.putInt("version", 100) + bundle.putBoolean("windows", True) + print(f" name: {bundle.getString('name')}") + print(f" version: {bundle.getInt('version')}") + print(f" windows: {bundle.getBoolean('windows')}") + print(f" size: {bundle.size()}") + + # BatteryManager 测试 + print("\n[BatteryManager 电池管理]") + bm = BatteryManager() + print(f" 电量: {bm.getLevel()}%") + print(f" 充电: {bm.isCharging()}") + print(f" 存在: {bm.isPresent()}") + print(f" 技术: {bm.getTechnology()}") + + # PowerManager 测试 + print("\n[PowerManager 电源管理]") + pm = PowerManager() + print(f" 交互: {pm.isInteractive()}") + print(f" 屏幕: {pm.isScreenOn()}") + + # Vibrator 测试 + print("\n[Vibrator 振动器]") + vib = Vibrator() + print(f" 有振动器: {vib.hasVibrator()}") + + # PatternMatcher 测试 + print("\n[PatternMatcher 模式匹配]") + pm_literal = PatternMatcher("/sdcard/test.txt", PatternMatcher.PATTERN_LITERAL) + pm_prefix = PatternMatcher("/sdcard/", PatternMatcher.PATTERN_PREFIX) + print(f" literal match: {pm_literal.match('/sdcard/test.txt')}") + print(f" prefix match: {pm_prefix.match('/sdcard/test.txt')}") + + # FileUtils 测试 + print("\n[FileUtils 文件工具]") + test_file = os.path.join(os.environ.get('TEMP', '/tmp'), 'android_pyapi_test.txt') + FileUtils.stringToFile(test_file, "Hello, Android-pyApi!") + content = FileUtils.readFileToString(test_file) + print(f" 写入读取: {content}") + os.remove(test_file) + + +def test_content_module(): + """测试 android.content 模块""" + print("\n" + "=" * 60) + print("android.content 模块测试") + print("=" * 60) + + from android_pyapi.android.content import ( + Uri, ContentValues, ContentResolver, Context, + SharedPreferences, IntentFilter, BroadcastReceiver, + ComponentName, ClipData, ClipDescription, + ContentProvider, ContentProviderClient, + ClipboardManager, + ) + + # Uri 测试 + print("\n[Uri 统一资源标识符]") + uri = Uri.parse("https://example.com/path?query=1&foo=bar#fragment") + print(f" scheme: {uri.getScheme()}") + print(f" host: {uri.getHost()}") + print(f" path: {uri.getPath()}") + print(f" query: {uri.getQuery()}") + print(f" fragment: {uri.getFragment()}") + print(f" toString: {uri.toString()}") + + # ContentValues 测试 + print("\n[ContentValues 内容值]") + cv = ContentValues() + cv.put("title", "Test") + cv.put("value", 42) + cv.put("flag", True) + print(f" title: {cv.getAsString('title')}") + print(f" value: {cv.getAsInteger('value')}") + print(f" flag: {cv.getAsBoolean('flag')}") + print(f" size: {cv.size()}") + + # Context 测试 + print("\n[Context 应用上下文]") + ctx = Context() + print(f" packageName: {ctx.getPackageName()}") + print(f" filesDir: {ctx.getFilesDir()}") + print(f" cacheDir: {ctx.getCacheDir()}") + print(f" dataDir: {ctx.getDataDir()}") + + # SharedPreferences 测试 + print("\n[SharedPreferences 持久化存储]") + sp = ctx.getSharedPreferences("test_prefs") + editor = sp.edit() + editor.putString("username", "test_user") + editor.putInt("login_count", 5) + editor.putBoolean("remember", True) + editor.commit() + print(f" username: {sp.getString('username')}") + print(f" login_count: {sp.getInt('login_count')}") + print(f" remember: {sp.getBoolean('remember')}") + + # ComponentName 测试 + print("\n[ComponentName 组件名]") + cn = ComponentName("com.example.app", "com.example.app.MainActivity") + print(f" package: {cn.getPackageName()}") + print(f" class: {cn.getClassName()}") + print(f" short: {cn.getShortClassName()}") + print(f" flatten: {cn.flattenToString()}") + + # ClipData 测试 + print("\n[ClipData 剪贴板数据]") + clip = ClipData.newPlainText("label", "Hello, Clipboard!") + item = clip.getItemAt(0) + print(f" text: {item.getText()}") + print(f" itemCount: {clip.getItemCount()}") + + # ClipboardManager 测试 + print("\n[ClipboardManager 剪贴板管理]") + cm = ClipboardManager() + cm.setText("Test Clipboard") + print(f" getText: {cm.getText()}") + print(f" hasText: {cm.hasText()}") + + +def test_app_module(): + """测试 android.app 模块""" + print("\n" + "=" * 60) + print("android.app 模块测试") + print("=" * 60) + + from android_pyapi.android.app import ( + Intent, Activity, Service, + Notification, NotificationManager, + AlarmManager, ActivityManager, + ) + + # Intent 测试 + print("\n[Intent 意图]") + intent = Intent(Intent.ACTION_VIEW) + intent.setData("https://example.com") + intent.putExtra("title", "Test") + intent.putExtra("count", 42) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + print(f" action: {intent.getAction()}") + print(f" data: {intent.getData()}") + print(f" title: {intent.getStringExtra('title')}") + print(f" count: {intent.getIntExtra('count')}") + print(f" flags: {hex(intent.getFlags())}") + + # Notification 测试 + print("\n[Notification 通知]") + notif = Notification() + notif.title = "Test Notification" + notif.text = "This is a test" + print(f" title: {notif.title}") + print(f" text: {notif.text}") + + # NotificationManager 测试 + print("\n[NotificationManager 通知管理]") + nm = NotificationManager() + print(f" 类型: {type(nm).__name__}") + + # AlarmManager 测试 + print("\n[AlarmManager 闹钟管理]") + am = AlarmManager() + print(f" 类型: {type(am).__name__}") + + +def test_widget_module(): + """测试 android.widget 模块""" + print("\n" + "=" * 60) + print("android.widget 模块测试") + print("=" * 60) + + try: + from android_pyapi.android.widget import ( + Toast, AlertDialog, Button, TextView, + EditText, ListView, RecyclerView, + ) + + # Toast 测试 + print("\n[Toast 提示]") + toast = Toast.makeText(None, "Hello, Toast!", Toast.LENGTH_SHORT) + print(f" text: {toast._text}") + print(f" duration: {toast._duration}") + + # AlertDialog 测试 + print("\n[AlertDialog 对话框]") + dialog = AlertDialog(None) + print(f" 类型: {type(dialog).__name__}") + + except ImportError as e: + print(f" widget 模块导入失败: {e}") + + +def test_graphics_module(): + """测试 android.graphics 模块""" + print("\n" + "=" * 60) + print("android.graphics 模块测试") + print("=" * 60) + + try: + from android_pyapi.android.graphics import ( + Bitmap, Canvas, Paint, Color, + Rect, RectF, Path, Matrix, + ) + + # Color 测试 + print("\n[Color 颜色]") + print(f" RED: {hex(Color.RED)}") + print(f" GREEN: {hex(Color.GREEN)}") + print(f" BLUE: {hex(Color.BLUE)}") + print(f" WHITE: {hex(Color.WHITE)}") + print(f" BLACK: {hex(Color.BLACK)}") + print(f" argb(255,128,64,32): {hex(Color.argb(255, 128, 64, 32))}") + + # Bitmap 测试 + print("\n[Bitmap 位图]") + bm = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888) + print(f" width: {bm.getWidth()}") + print(f" height: {bm.getHeight()}") + print(f" config: {bm.getConfig()}") + + # Paint 测试 + print("\n[Paint 画笔]") + paint = Paint() + paint.setColor(Color.RED) + paint.setTextSize(24.0) + print(f" color: {hex(paint.getColor())}") + print(f" textSize: {paint.getTextSize()}") + + # Rect 测试 + print("\n[Rect 矩形]") + rect = Rect(10, 20, 100, 200) + print(f" left: {rect.left}") + print(f" top: {rect.top}") + print(f" right: {rect.right}") + print(f" bottom: {rect.bottom}") + print(f" width: {rect.width()}") + print(f" height: {rect.height()}") + + except ImportError as e: + print(f" graphics 模块导入失败: {e}") + + +def test_java_module(): + """测试 java 模块""" + print("\n" + "=" * 60) + print("java 模块测试") + print("=" * 60) + + from android_pyapi.java.lang import ( + String, StringBuilder, Integer, Math, System, Thread, + ) + from android_pyapi.java.io import ( + File, FileInputStream, FileOutputStream, + ) + from android_pyapi.java.util import ( + ArrayList, HashMap, HashSet, + ) + from android_pyapi.org.json import JSONObject, JSONArray + + # String 测试 + print("\n[String 字符串]") + s = String("Hello, Android-pyApi!") + print(f" length: {s.length()}") + print(f" upper: {s.toUpperCase()}") + print(f" contains('Android'): {s.contains('Android')}") + print(f" substring(7): {s.substring(7)}") + + # StringBuilder 测试 + print("\n[StringBuilder 字符串构建器]") + sb = StringBuilder() + sb.append("Hello") + sb.append(", ") + sb.append("World!") + print(f" result: {sb.toString()}") + print(f" length: {sb.length()}") + + # Integer 测试 + print("\n[Integer 整数]") + print(f" parseInt('42'): {Integer.parseInt('42')}") + print(f" MAX_VALUE: {Integer.MAX_VALUE}") + print(f" MIN_VALUE: {Integer.MIN_VALUE}") + + # Math 测试 + print("\n[Math 数学]") + print(f" PI: {Math.PI}") + print(f" abs(-42): {Math.abs(-42)}") + print(f" max(10, 20): {Math.max(10, 20)}") + print(f" sqrt(144): {Math.sqrt(144)}") + print(f" pow(2, 10): {Math.pow(2, 10)}") + + # ArrayList 测试 + print("\n[ArrayList 列表]") + lst = ArrayList() + lst.add("Apple") + lst.add("Banana") + lst.add("Cherry") + print(f" size: {lst.size()}") + print(f" first: {lst.get(0)}") + print(f" contains('Banana'): {lst.contains('Banana')}") + + # HashMap 测试 + print("\n[HashMap 哈希表]") + m = HashMap() + m.put("name", "Android-pyApi") + m.put("version", "1.0.0") + print(f" name: {m.get('name')}") + print(f" size: {m.size()}") + print(f" containsKey('name'): {m.containsKey('name')}") + + # JSONObject 测试 + print("\n[JSONObject JSON 对象]") + json = JSONObject() + json.put("platform", "Windows") + json.put("python", True) + json.put("version", 3.12) + print(f" toString: {json.toString()}") + print(f" platform: {json.getString('platform')}") + + # File 测试 + print("\n[File 文件]") + f = File(os.environ.get('TEMP', '/tmp'), "test_file.txt") + print(f" path: {f.getAbsolutePath()}") + print(f" name: {f.getName()}") + print(f" parent: {f.getParent()}") + + +def main(): + """主测试函数""" + print("=" * 60) + print("Android-pyApi 扩展 API 测试") + print("=" * 60) + + test_os_module() + test_content_module() + test_app_module() + test_widget_module() + test_graphics_module() + test_java_module() + + print("\n" + "=" * 60) + print("所有测试完成!") + print("=" * 60) + + +if __name__ == "__main__": + main() \ No newline at end of file